django请求周期生命流程图
django的生命周期是从用户发送HTTP请求数据到网站响应的过程。
整个过程的流程包括:
浏览器发送HTTP请求 ——> wsgiref服务 ——> 中间件 ——> 路由层urls ——> 视图层views ——> models模型层 ——> (通过orm)MySQL获取数据 ——> 视图层 ——>templates模板层 ——> 视图层渲染 ——> 中间件 ——> 响应内容给浏览器
1.首先,用户在浏览器中输入一个url,发送一个GET方法的request请求。
2.在django中有一个封装了socket的方法模块wsgiref,监听端口接受request请求,初步封装传送到中间件。
3.由中间件传输到路由系统中进行路由分发,匹配对应的视图函数。
4.将request请求传输到views视图函数中进行逻辑处理。
5.调用models中表对象,通过orm操作数据库拿到数据,同时去templates中相应的模板进行渲染
6.用response响应传输到中间件,依次处理,响应给浏览器展示给用户
路由匹配
路由匹配的结构: path('admin/', admin.site.urls)
path(第一个参数是网址后缀 ,第二个参数是函数名/类名)
# 一旦网址后缀匹配上了就会自动执行后面的函数,并且结束整个路由的匹配(后面再有相同的网址后缀,也不会再匹配了)
路由结尾的斜杠
默认情况下不写斜杠的话 django底层会做二次处理
正常情况不加斜杠的网址请求在django底层是做了二次处理的
第一次 会返回301 重定向
第二次 会返回200 请求成功
ps:django配置文件中可以指定是否自动添加斜杠
APPEND_SLASH = False # 加上这个配置不会自动添加
不建议添加 用户体验不好
path转换器(只在django2.x版本以上才有)
# 当网址后缀不固定的时候 可以使用转换器来匹配
有五种类型:
'int': IntConverter(),
'path': PathConverter(),
'slug': SlugConverter(),
'str': StringConverter(),
'uuid': UUIDConverter(),
匹配的格式是:path('func/<int:year>/<str:info>/', views.func) # 后缀想加什么类型的和数量可以直接写上去
'''
转换器匹配到的内容会当作视图的关键字参数传入,转换器写入几个,写入的名字,必须和视图函数的参 数一一对应
'''
def func(request,year,info):
pass
re_path正则匹配(z很重要!)
re_path的结构: re_path(正则表达式,函数名)
特点是:后缀只要有正则表达式符合的文本,那么就算匹配成功,不管后缀后面有多少内容!
可以在后缀后面加上斜杠(也可以区分跟路由匹配的结果)
re_path('^test/$', views.test)
为了提高匹配的精准度 可以在正则表达式里开头加^结尾加上$,这样匹配的文本就必须和输入的保持一致
当网址后缀不固定的时候可以使用转换器来匹配
正则匹配之无名分组
正则匹配如果网址后缀不固定的时候,想要匹配的更多个
re_path('^test/(\d+)/(.*?)', views.test)
第一个网址后缀只能是test,第二个后缀是可以匹配任意数字,第三个后缀是可以匹配任意类型任意数量
'''正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数'''
正则匹配之有名分组
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test)
就是给正则表达式起别名的方式。
正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数
此时的函数参数就需要和转换器的一样了!写什么名字传什么参数
django匹配版本区别
在django1.11中 只支持正则匹配 并且方法是 url()
django2,3,4中 path() re_path() 等价于 url()
反向解析
'''反向解析应用的场景:页面上写了很多固定的路由,一旦路由发生改变,那么所有相关页面的链接都会失效
为了防止这个问题,我们需要使用反向解析
'''
# 反向解析会返回一个结果,该结果可以访问到对应的路由
1.路由对应关系起别名
path('index/',views.index,name='ind_view')
2.使用反向解析语法(reverse)
html页面:
{% url 'ind_view' %}
后端:
三板斧的模块:from django.shortcuts import reverse
reverse('ind_view')
# 反向解析的操作适用于三个中路由匹配方式
path(),re_path() ,url()
有名无名反向解析
'''当路由中有不确定的匹配因素,那么反向解析的时候需要人为的给出一个值'''
path('index/<str:info>/',views.index,name='ind_view')
reverse('ind_view',arg=('summer',))
{% url 'ind_view','summer'%}
# 反向解析的操作适用于三个中路由匹配方式
path(),re_path() ,url()
路由分发(关键字include)
'''django中的应用都有自己独立的文件夹
urls.py views.py templates.py models.py
能够让基于django开发的当多个应用完全独立 便于小组开发
'''
总路由:path('app01/',include('app01.urls'))
path('app01/',include('app01.urls'))
子路由:path('func/',views.func) #app01
path('func/',views.func) #app02
ps:使用场景:当项目特别大的时候,应用特别多的时候,使用路由分发,非常方便
名称空间
'''主要应用于路由分发下的多个应用涉及到反向解析时候的别名冲突无法解析的问题'''
解决方法1:
namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
解决方法2:
把应用名当作别名的前缀,这样就无法冲突(需要保证django项目下没有重复的名字)
标签:匹配,views,后缀,视图,Django,path,路由
From: https://www.cnblogs.com/Hsummer/p/16647903.html