Django路由层
目录
django请求生命周期流程图
路由层之路由匹配
路由匹配的特点
正则 | 内容 | 匹配结果 |
---|---|---|
home | home | 匹配出test文本 |
home | homeplus | 匹配出test文本 |
jango二次追加斜杠机制
正则是home/ 内容是home
首次无法匹配,django默认加斜杠再次发送请求
解决路由前面可以随意添加字符的问题
正则是home/ 内容是aaahome/ 可匹配出文本home/
可以在正则的最前面加上上箭头'^'来限制
解决路由后面可以随意添加字符的问题
正则是^home/ 内容是home/aaa/bbb/ccc/ddd/ 可以匹配出文本home/
可以在正则的最后面加上$来限制
注意:由于第一个参数是正则,对应关系特别多的时候要格外注意是否会出现路由顶替
扩展:
定制一个主页面不携带后缀可以直接访问
url(r'^$',views.home)
定义一个尾页,用于没有对应关系的场景
url(r'.*',views.error)
无名有名分组
无名分组
路由匹配中使用括号对正则表达式进行了分组那么在调用视图函数的时候
会将括号内匹配到的内容当做位置参数传递给视图函数
home(request,括号内正则表达式匹配到的内容)
url(r'^home/([0-9]{4})/$', views.home)
有名分组
路由匹配中给括号内的正则表达式起了别名,
匹配成功则会讲括号内匹配到的内容按照关键字参数传递给视图函数
home(request,webid=括号内正则表达式匹配到的内容)
url(r'^home/(?P<webid>[0-9]{5})/$', views.home)
无名有名分组是否可以混合使用
情况一
无名有名分组不能混合使用
url(r'^home/(\d+)/(?P<webid>[0-9]{5})/$', views.home)
情况二
单个可以重复使用
url(r'^home/(\d+)/(\d+)/$', views.home)
url(r'^home/(?P<wid>\d+)/(?P<webid>\d+)/$', views.home)
反向解析
# 常见问题
1. 页面上有很多a标签链接了其他路由
2. 路由匹配表达式出现了变化导致html页面上的地址全部失效
# 反向解析
通过反向解析可以获取到一个结果,通过该结果可以访问到一个路由
步骤1:给对应关系起别名
url(r'^registerplus/',views.register,name='register_view')
步骤2:使用反向解析获取结果
前端:
{% url 'register_view' %} # registerplus/ 结果可以访问路由
后端:
from django.shortcuts import reverse
reverse('register_view') # registerplus/ 结果可以访问路由
# 无名分组反向解析
步骤1:给对应关系起别名
url(r'^registerplus/(\d+)/',views.register,name='register_view')
步骤2:使用反向解析获取结果
# 无法明确括号内正则表达式的内容需要人为指定
前端:
{% url 'register_view' 999 %} # registerplus/999/
后端:
from django.shortcuts import reverse
reverse('register_view',args=(plus,)) # registerplus/plus/
# 有名分组反向解析
步骤1:给对应关系起别名
url(r'^registerplus/(?P<id>\d+)/',views.register,name='register_view')
步骤2:使用反向解析获取结果
# 无法明确括号内正则表达式的内容需要人为指定
前端:
{% url 'register_view' 999 %} # registerplus/999/
{% url 'register_view' id=999 %} # registerplus/999/
后端:
from django.shortcuts import reverse
reverse('register_view',args=(plus,)) # registerplus/plus/
reverse('register_view',kwargs={'id':1}) # registerplus/1/
路由分发
# 问题
若一个django项目特别庞大,里面有很多应用,每个应用下有很多对应关系
django自带的路由层里面的代码就会非常多,不方便查看和管理怎么解决
# 答案
根据应用的不同拆分到不同的应用中
# 思路
django支持每个应用都可以有自己独立的
路由层、模板层、静态文件、视图层(默认)、模型层(默认)
# 路由分发的特点
django的特性能够让django在分组开发上更加的方便、快捷
所有人都可以在应用中开发完整的项目功能
最后汇总到一个空的django项目中通过路由分发整合所有人的应用
# 步骤一:创建多个应用并去配置文件中注册
INSTALLED_APPS = [
'app01',
'app02'
]
# 步骤二:在多个应用中编写相同的路由
urlpatterns = [
url(r'^index/',views.index111)
]
urlpatterns = [
url(r'^index/',views.index)
]
# 步骤三:路由分发
总路由
from django.conf.urls import url, include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
注意:总路由只负责分发,不负责视图函数对应
# 上述代码的简写
from django.conf.urls import url, include
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
名称空间
# 问题
不同的应用使用了相同的别名,反向解析能否自动识别
index_view app01/index/
index_view app02/index/
验证发现默认情况下是不会自动识别应用前缀的 如何解决反向解析问题
# 解决办法
# 方式1:名称空间
总路由添加名称空间
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
应用反向解析自动提示
reverse('app01:index_view')
reverse('app02:index_view')
{% url 'app01:index_view' %}
{% url 'app02:index_view' %}
# 方式2:只需要确保反向解析的别名在整个项目中是唯一的
可以在别名的前面加上应用名的前缀
url(r'^index/',views.index,name='app01_index_view')
url(r'^index/',views.index,name='app02_index_view')