Django 请求生命周期与路由层介绍
Django请求生命周期
整体流程说明:
通过浏览器发送请求
web服务网关接口接受请求,django默认使用自带的wsgiref模块,作用是请求来的时候解析封装发送给中间件,响应走的时候打包处理
补充:
django自带的wsgiref模块本身能够支持的并发量很小,最多1000左右,上线之后会换成uwsgi
WSGI指的是协议 wsgiref和uwsgi是实现该协议的功能模块
中间件先向缓存库里面发送请求请求数据,有数据则返回数据给网关接口,没有则向路由层发送请求
路由层接受到请求后,向视图层发送请求
视图层接受到请求后会根据请求分别向模板层和模型层发送请求
模板层接受请求后返回数据,模型层会向数据库发送请求,并返回数据库返回过来的数据
视图层接受模板层和模型层返回数据后,会将数据结合进行渲染,完成后返回给路由层
路由层接受数据后会将数据返回给中间件
中间件会将数据发送2份数据,一份给网关接口,一份给缓存库
网关接收到数据后,发送给浏览器
路由层
路由匹配介绍
# 路由匹配
url(r'test',views.test),
url(r'testadd',views.testadd)
url方法的第一个参数是正则表达式
只有第一个参数正则表达式能够匹配到内容,name就会立刻停止匹配,直接执行对应的视图函数
在输入url的时候会默认添加斜杆
django内部会自动做到重定向
一次匹配不成功,url后面会添加斜杠再来一次
# 取消自动加斜杠 settings.py文件中
APPEND_SLASH = False/True # 默认是True
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 首页
url(r'^$',views.home),
# 路由匹配
url(r'^test/$',views.test),
url(r'^testadd/$',views.testadd),
]
无名分组与有名分组
分组:就是给某一段正则表达式用小括号扩起来
无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
url(r'^test/(\d+)/',views.test)
def test(request,xx):
print(xx)
return HttpResponse('test')
有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
url(r'^testadd/(?P<year>\d+)',views.testadd)
def testadd(request,year):
print(year)
return HttpResponse('testadd')
注意:
无名分组和有名分组在django中不能混合使用 但是同一个分组可以使用n多次
反向解析
- 指通过一些方法得到一个结果, 该结果可以直接访问对应url触发视图函数
1. 先给路由与视图函数起一个别名
url(r'^func/', views.fun, name='ooo')
2. 反向解析
1. 后端反向解析
from django.shortcuts import reverse
reverse('ooo')
2. 前端反向解析
<a href="{% url 'ooo' %}">点我</a>
- 无名分组反向解析
路由书写
url(r'^index/(\d+)/',views.index,name = 'xxx')
'''
index/数字/ 都能解析到
需要传入一个能够被 /(d+)/ 解析到的参数才能正常运行
'''
前端代码
{% url 'xxx' 123%} # 123 手动传入的参数
后端代码
reverse('xxx', args=(1,)) # args = (1,) 手动传入一个参数
'''
传入的数字一般情况下放的是数据的主键值
'''
- 有名分组反向解析
路由书写
url('r^func/(?P<year>\d+)',views.func,name='ooo')
前端
方式1:
<a href="{% url 'ooo' year=123 %}">111</a>
方式2:
<a href="{% rul 'ooo' 123 %}">222</a>
后端
方式1:
reverse('ooo', kwargs={'year':123})
方式2:
reverse('ooo',args=(111,))
注意 :
- 当前端页面解析到的值(\d+匹配的值),在路由层会直接传给对应的视图层功能模块
路由分发
Django框架的每一个应用都可以有自己的templates urls.py static文件夹 ,基于这一特性,Django能够非常好的做到分组开发(即每个人只写自己的app)
最后再由boss 将app全部拷贝到一个新的Django项目中 然后再配置文件中注册所有的app,最后利用路由分法的特点将所有的app整合起来
当一个Django项目中的url特别多的时候 总路由urls.py代码非常冗余不好维护,这个时候也可以利用路由分发来减轻总路由的压力
利用总路由分发之后 总路由不再干路由与视图函数的直接对应关系而是去做一个分发处理
识别当前url是属于那个应用下的 直接分发给对应的应用去处理
用法:
# 总路由导入各app中路由和模块
from django.conf.urls import url, include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 1.路由分发方式1
url(r'^app01/',include(app01_urls)), # 只要url前缀是app01开头 全部交给app01处理
url(r'^app02/',include(app02_urls)) # 只要url前缀是app02开头 全部交给app02处理
# 2.路由分发方式2(推荐) 不用起别名
url(r'^app01/',include('app01.urls'))
url(r'^app02/',include('app02.urls'))
# 子路由中
# app01 urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^reg/',views.reg)
]
# app02 urls.py
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^reg/',views.reg)
]
注意:
总路由里面的url千万不能加$符结尾