django请求生命周期流程图
django路由层
1.路由匹配
django1.X版本路由的第一个参数是正则表达式
django2.X及以上版本的则是path写什么就匹配什么
# 无论什么版本的django都自带加斜杠后缀的功能,我们可以把这个功能手动取消
取消自动加斜杠后缀功能
配置文件中加 APPEND_SLASH = False # 默认为True,且不在配置文件中显示
2.转换器
将对应位置匹配到的数据转换成固定数据类型
正常情况下一个网站会有很多相似的网址,如果每个都开一个路由的话太累了,所以就有了转换器
django2.X及以上版本路由的动态匹配有转换器
五种转换器
str:匹配除路径分隔符外所有的非空字符串
int:匹配0或者任意正整数
slug:匹配任意一个由字母或数字组成的字符串
uuid:匹配格式化之后的UUID
path:匹配完整的URL路径
# 这五种转换器中常用的就是str和int,除了这五种转化器我们还可以自定义转换器(就是自己写一个正则表达式)
eg:
path('index/<str:info>/', views.index_func),
# index_func(实参request对象,info='经过转换器转换过的匹配内容') info就相当于关键字传参
3.正则匹配
django2.X级以上版本有re_path,第一个参数是正则表达式
正则匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到对应的数据就匹配成功(无论用户输入了什么),
会立刻停止匹配直接执行对应的视图函数
eg:
re_path('^test/$', views.test) # 只匹配路由为test/的路由
# django1.X路由匹配使用的是url(),功能与django2.X及以上的re_path()一致
4.正则匹配的无名有名分组
无名分组
re_path('^test/(\d{4})/', views.test) # 将括号内正则匹配到的内容当做位置参数传递给视图函数
有名分组
re_path('^test/(?P<year>\d{4})/', views.test) # 对括号内的正则表达式起一个别名
# 将括号内的正则匹配到的内容与别名组成关键字参数传递给视图函数,year='正则匹配到的内容'
注意: 无名分组与有名分组不能混合使用
反向解析
通过一个名字可以反向解析出一个结果,该结果可以访问到某个对应的路由
基本使用
1.路由匹配关系起别名
path('login_01', views.login, name='login_view')
2.反向解析语法
html页面模板语法 {% url 'login_view' %}
后端语法 reverse('login_view')
动态路由的反向解析
path('func1/<str:others>/', views.func1_func, name='func1_view')
html页面上模板语法 {% url 'func1_view' 'jason' %} # 需要一个参数与接收到的路由的第二个参数对应
后端语法 reverse('func1_view', args=('嘿嘿嘿',))
标签:匹配,views,django,test,path,路由,view
From: https://www.cnblogs.com/zyg111/p/16977164.html