django静态动态路由

1,351 阅读1分钟

django静态动态路由

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

1、include路由分发

1.1 在app下重新创建一个urls.py

from django.conf.urls import url
from app01 import views
​
urlpatterns = [
    url(r'^blog/$', views.blog),
    url(r'^blogs/([0-9]{4})/$', views.blogs,{"k1":"v1"}), # blogs/2012/
]

1.2 改原本项目下的urls.py里面的内容加上include

from django.conf.urls import url,include
from django.contrib import admin
​
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # url(r'^app01/', include("app01.urls")),# http://127.0.0.1:8000/app01/blogs/2002/
    url(r'^', include("app01.urls")),# http://127.0.0.1:8000/blog/  如果为空的话
]

里面参数可以为空(其实就是把原来urls.py里面的参数封装到app下,让在用include()调用app下的urls.py)的内容

2、url的命名和反向解析

其实就是和as一样 设置一个别名

2.1 静态路由

命名:

```
url(r'^blogs/$', views.blogs, name="bloogs"),  # 设置一个别名 bloogs
```

反向解析:

模板 生成的地址

```
<a href="{% url 'bloogs' %}">测试url的命名和反向解析</a>     --> blogs - bloogs 获取的就是blogs  
其实就是访问了别名为bloogs对应的url
```

py

```
from django.shortcuts import reverse  #有两种导入的方法
from django.urls import reverse
​
print(reverse("bloogs"))  #/blogs/
```

2.2 动态路由

-   分组

```
    url(r'^blogs/([0-9]{4})/(\d{2})$', views.blogs, name="bloogs"),
```

反向解析:

模板

```
<a href="{% url 'bloogs' '2002' '02' %}">测试url的命名和反向解析</a>
#要给上参数,还要参数对应,不然就会出错
其实就是访问了别名为bloogs对应的url
```

py

```
print(reverse("bloogs",args=(2002,99)))  # /blogs/2002/99
```

-   命名分组

    分组

    ```
        url(r'^blogs/(?P<year>[0-9]{4})/(?P<method>\d{2})$', views.blogs, name="bloogs"),
    ```

    反向解析:

    模板

    ```
    {#<a href="{% url 'bloogs' '2002' '02' %}">测试url的命名和反向解析</a>#}  #这个要对应参数
    <a href="{% url 'bloogs' method='99' year='2000' %}">测试url的命名和反向解析</a> #这个不用对应参数
    其实就是访问了别名为bloogs对应的url
    ```

    py

    ```
    print(reverse("bloogs",args=(2002,99)))  # /blogs/2002/99
    print(reverse("bloogs",kwargs={"year":"2009","method":99}))  # /blogs/2009/9
    ```

3、命名空间 namespace

app01 urls.py:
​
urlpatterns = [
    url(r'^home/$', views.home, name='home')
]
​
​
app02 urls.py:
urlpatterns = [
    url(r'^home/$', views.home, name='home')
]
​
#app01和app02我们写了一样的别名
#我们用app01调用html的时候{% url 'home' %},app02的home会覆盖了app01里面的home

为了避免以上操作:我们就要加namespace

# 在项目的urls.py下
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/', include("app01.urls", namespace="app01")),
    url(r'^app02/', include("app02.urls", namespace="app02")),
]

光加了命名空间,也不行。我们在用反向解析和py的时候,也要在对应的地方区分并添加

反向解析:
模块
{% url 'app01:home' %}
{% url 'app02:home' %}
py
 print(reverse("app01:home"))  # /app01/home/
 print(reverse("app02:home"))  # /app02/home/