三、路由层(urls.py)
一、路由匹配
1. URL第一个参数是正则表达式,一旦匹配到内容,会立刻结束匹配关系
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/$', views.test),
]
2. django路由匹配时,先不加斜杠匹配一次,如果匹配不上,则加斜杠再匹配一次,再匹配不上,就报错。取消自动加斜杠的功能,需要在settings中加上下面代码。
APPEEND_SLASH = False
3. 路由匹配只匹配URL部分,不配‘?’后面get携带的参数
二、有名分组与无名分组
1. 无名分组
函数会将无名分组内正则表达式匹配到的内容当做位置参数传递给视图函数。
a. 路由
url(r'^test/(\d+)/', views.test)
b. 后端
def test(request, '正则表达式匹配到的内容')
pass
2. 有名分组
函数会将有名分组内正则表达式匹配到的内容当做关键字参数传递给视图函数。
a. 路由
url(r'^test/(?P<year>\d+)/', views.test)
b. 后端
def test(request, 'year')
pass
3. 同一匹配函数内无名分组和有名分组不能混合使用
三、反向解析
根据别名,动态解析出一个结果,该结果可以直接访问对应的URL。
1. 没有正则表达式的反向解析
a. 路由
url(r'^test/', views.test, name='xxx')
b. 前端
<ahref="{%url'xxx'%}">前端反向解析</a>
c. 后端
def get_url(request):
url=reverse('xxx')
print(url)
2. 无名分组的反向解析
a. 路由
url(r'^test/(\d+)/', views.test, name='xxx')
b. 前端
需要在前端手动指定正则匹配的内容,数字通常是数据的主键值。
<ahref="{% url 'xxx' 123 %}">前端反向解析</a>
c. 后端
在args中以元组形式传入能被正则表达式匹配到的参数
def get_url(request):
url=reverse('xxx', args=(1,))
print(url)
3. 有名分组的反向解析
a. 路由
url(r'^test/(?P<year>\d+)/', views.test, name='xxx')
b. 前端
# 简写
<ahref="{% url'xxx' 19 %}">前端反向解析</a>
# 规范写法
<ahref="{% url 'xxx' year=19 %}">前端反向解析</a>
c. 后端
# 简写
def get_url(request):
url=reverse('xxx', args=(19,))
print(url)
# 规范写法
def get_url(request):
url=reverse('xxx', kwargs=('year': 19))
print(url)
四、路由分发
1. 路由分发过程
1. 将所有的app手动建自己独立的urls.py、templates、static。
2. 组长将所有人开发的app整合到一个空的django项目中。
3. settings中注册app,总路由将请求转发给对应的app。
2. 总路由代码
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls'))
]
五、名称空间
当多个app中出现起别名冲突的情况,在做路由分发的时候,可以给每一个app创建一个名称空间,在反向解析时,能选择去哪个名称空间中查找别名。
起别名时统一加上应用名前缀即可避免使用名称空间。
1. 总路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02'))
]
2. 后端
def reg(request):
print(reverse('app01:reg'))
pass
3. 前端
<ahref="{%url'app01:reg'%}"></a>
<ahref="{%url'app02:reg'%}"></a>
六、伪静态
1. 作用
将一个动态网页伪装成一个静态网页,来提高搜索引擎查询频率。
2. 实现方法
在路由后面以‘.html’结尾
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test。html', views.test),
]
七、不同django版本路由匹配的区别
1. django 1.x版本路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),
]
2. django 2.x版本路由
urlpatterns = [
path('admin/', admin.site.urls),
path('test/', views.test),
re-path(r'^test/', views.test)
]
3. 区别
django 2.x版本里面path第一个参数不支持正则表达式,写什么匹配什么,除非使用re-path。
八、无名分组反向解析结合示例
1. 路由
url(r'^edit_user/(\d+)',views.edit_user,name='edit')
2. 前端
{% for user_obj in user_list %}
<a href="/edit_user/{{user_obj.id}}/">编辑</a>
<ahref="{% url 'edit' user_obj.id %}">编辑</a>
{% endfor %}
3. 后端
defedit_user(request,edit_id):
pass