django请求生命周期流程图

django路由层
# 1.路由匹配
django1.x 第一个参数是正则表达式
django2.x+ path第一个参数写什么就匹配什么
"""
-1.django所有版本都会在在匹配时有自己加斜杠后缀的功能
-2.使其不加斜杠匹配,在django的settings:
APPEND_SLASH = False
"""
# 2.转换器
当我们无法确定自己的网址后缀是否固定时,就可以使用转换器
django2.x及以上动态匹配有五种转换器
"""
str: 匹配除路径分隔符外的任何非空的字符
int:匹配0或任意正整数
sulg:匹配任意一个由字母或数字组成的字符
uuid:匹配格式化后的uuid
path:能够匹配完整的url路径
"""
ps: django支持自定义转换器(方便自己写正则表达式匹配更加细化的内容)
path('login_auth/', views.login),
# views视图传参:login(request)
path('register/<str:func>/',views.register_func),
# views视图传参:register_func(request, func)
path('register/<str:func>/p/<int:id>/', views.register_func)
# views视图传参:register_func(request, func, id)
"""
# 1.使用转换器会对视图函数产生影响
# 2.转换器匹配到的内容需要当作视图函数的关键字参数传入
# 3.转换器有几个,视图函数的参数就必须有几个
"""
# 3.正则匹配
"""django2.x以上有re_path"""
-1. re_path(正则表达式,函数名(视图函数地址))
一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数,然后结束整个路由的匹配
-2. re_path('^test/$', view.test)
当网址后缀不固定时可以使用转换器来匹配
# 4.正则匹配的无名有名分组
无名分组: re_path('^test/(\d+)/', views.test)
正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数
有名分组: re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test)
正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
"""无名分组与有名分组不能混合使用"""
反向解析
"""
页面上提前写死了许多路由,一旦路由发生变化会导致所有页面相关的链接失效,针对此类问题需要使用反向解析
"""
# 1.什么是反向解析?
返回一个结果,该结果可以访问到对应的路由
# 2.路由对应关系起别名
path('login_auth/', views.login, name='login')
# 3.反向解析语法的使用
前端: {% url 'reg_view' %}
后端: 1.先导入
from django.shortcuts import reverse
2.视图函数内写入
reverse('reg_view')
"""无名解析:在path,re_path,url中的操作是相同的"""
# 4.动态路由的有名无名反向解析
- 路由层:
path('register/<str:func>/p/<int:id>/', views.register_func, name='register_func')
- 视图层:
def register_func(request,func,id):
reverse('register_func',args=('123',1234,))
return render(request,'001.html')
- 前端:
<a href="{% url 'register_func' '123' 1234 %}"></a>
- url输入:
http://XXX/register/123/p/1234/
路由分发
# 1.django中的应用都可以有自己独立文件
urls.py、templates文件夹、static文件夹
# 2.为什么要路由分发?
-1.为了能够让基于django开发的多个应用完全独立,便于小组开发
-2.当项目特别大 应用特别多的时候 可以使用路由分发
# 3.总路由负责将指明道路,子路由负责操作数据
总路由:
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),
子路由:
path('after/', views.after) # app01
path('after/', views.after) # app02
django名称空间
# 1.有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
-1.解决方式1
名称空间:
namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
-2.解决方式2:
- 别名不冲突即可
- 保证django项目下没有重复的别名即可