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/