1.Django请求生命周期流程图
1.路由层、视图层、模板层、模型层、组件、BBS项目
2.django路由层
1.路由匹配:
'''当我们输入一个地址时,接口后面的/不用输入,也可以自动跳转'''
django2.X以上版本,path第一个参数末尾可以不加/,django也会自动补全该接口。
django1.X版本:第一个参数是正则表达式,无法补全。
如果想取消django2.X以上版本的自动补全功能,需要在settings.py中加入:APPEND_SLASH = False。
2.转换器:
'''正常情况下很多网站都会有很多相似的网址,如果我们每一个都单独开发开设路由不合理'''
2.1当我们想在接口后面继续增加一个后缀时,我们可以在接口后面加上/<str:info>/,比如:path('index/<str:a>/', views.index)表示index/后面两个/之间输入任意字符串内容,该地址访问到的还是/index/地址,并且该字符串还能被index()函数接收到。index函数有两个参数:index(request,a),这个a表示的就是index/后面接收到的字符串(可以带数字)。
# 1
2.2/<int:num>/:匹配0或者任意正整数。
# 2 3
2.3其他匹配内容:
slug:匹配任意一个由字母或数字组成的字符串。
uuid:匹配格式化后的UUID。
path:能够匹配完整的URL路径
ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容)
3.正则匹配:
django2.X以上版本可以通过正则来匹配,需要提前导入模块re_path,第一个参数是正则。当我们在urls中写入一个接口,第一个参数只要能通过正则匹配到地址栏输入的接口,那么就可以匹配到该接口对应的功能能。
# 4 5
"""
但是不加任何符号匹配也有弊端,比如在urls中分别定义一个'test'和'testadd'的接口(test接口在上),那么我们能在地址栏输入/testadd/时,通过正则从上到下首先匹配到的是'test',所以我们匹配到的是test对应的功能,然后结束路由层的匹配,直接执行视图函数。想要解决该问题可以将接口改为re_path('test/', views.test)。或者是加上正则筛选条件:
urlpatterns = [
re_path('^test/$', views.test),
re_path('^testadd/$',views.testadd)
]
"""
# 6 7
4.正则匹配的无名有名分组:
4.1无名分组:re_path('test/(\d{4})/',views.test),会将括号内的正则匹配到的内容当做位置参数传递给视图函数。
# 8 9
4.2有名分组:re_path('func/(?P<num>\d{4})/(?P<var>\d{4})',views.function),会将括号内的正则匹配到的内容当做关键字参数传递给视图函数,所以视图函数在定义形参时需要将request以外的形参定义成<>内的名字。
# 10 11
3.反向解析
反向解析:在a标签中,如果一个路由经常变化,那么我们可以通过一个名字反向解析出一个结果,该结果可以直接访问到某个对应的路由,而不通过路由访问。
1.路由关系起别名基本语法:
path('login/', views.login, name='login_view')
<a href="{% url 'login_view' %}">home界面</a> # 点击home界面就可以直接访问到login/路由对应的功能
2.反向解析语法:
urls语法:path('login001/', views.login, name='login_view')
html页面上模板语法:<a href="{% url 'login_view' %}">home界面</a>
后端语法:reverse('login_view')
3.动态路由的反向解析
path('func1/<str:others>/', views.func1_func, name='func1_view')
html页面上模板语法:{% url 'func1_view' 'jason' %}
后端语法:reverse('func1_view', args=('嘿嘿嘿',))
标签:index,匹配,views,Django,反向,test,path,路由
From: https://www.cnblogs.com/zkz0206/p/16977305.html