middleware中间件
参考博客https://www.cnblogs.com/maple-shaw/articles/9333824.html
中间件是处理django的请求和响应的框架级别的钩子,本质是一个类(直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作)
由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
定义的中间件需要注册
django中请求响应流程
![1561798819879](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561798819879.png)
# 1.中间件定义的五个方法:
- process_request(self,request)
- process_response(self, request, response)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_exception(self, request, exception)
- process_template_response(self,request,response)
------最好全记住!!!!!!!!!!!!
# 1.1 process_request
- process_request(self,request)
# 特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
执行时间: 在执行视图函数之前执行
参数: request
- request和视图函数中的的request是一个对象
执行顺序:
- 按照注册的顺序进行执行
返回值:
- 返回值为none的时候,执行顺序正常
- 返回值如果是HttpResponse, 后面的中间件的process_request、视图函数都不执行,直接执行当前中间件中的process_response方法,再倒序执行之前的中间件中process_response方法。
# 1.2 process_response
- process_response(self, request, response)
# 特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
- 执行时间: 在执行视图函数之后执行
- 参数: request / response
- request 和视图函数中的的request是一个对象
- response 返回给浏览器响应对象(不一定是视图对象,peocess_request也会返回对象)
- 执行顺序:
- 按照注册的顺序,倒序执行
- 返回值:
- HttpResponse:必须返回response对象
process_request执行流程
![1561802908112](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561802908112.png)
# 1.3 process_view
- process_view(self, request, view_func, view_args, view_kwargs)
# 特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
执行时间: 视图函数之前,process_request之后
参数: request
- request 和视图函数中的的request是一个对象
- view_func 视图函数
- view_args 视图函数的位置参数
- view_kwargs 视图函数的关键字参数
执行顺序:
- 按照注册的顺序进行执行
返回值:
- 返回值为none的时候, 执行顺序正常
- 返回值如果是HttpResponse, 后面的中间的process_view、视图函数都不执行,直接执行注册的最后一个中间件中的process_response方法,再倒叙执行之前的中间中process_response方法。
执行流程图
![1561802700654](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561802700654.png)
# 1.4process_exception
- process_exception(self, request, exception)
# 特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
执行时间((触发条件)): 视图函数之后,视图层面有错时才执行
参数: request/exception
- request 和视图函数中的的request是一个对象
- exception 视图中的错误对象
执行顺序:
- 按照注册的顺序 倒叙执行
返回值:
- 返回值为none的时候, 交给下一个中间件取处理异常,都没有处理交由django处理异常
- 返回值如果是HttpResponse, 后面的中间件的process_exception不执行,直接执行最后一个中间件中的process_response方法,倒叙执行之前的中间中process_response方法。
流程图
![1561801490783](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561801490783.png)
# 1.5process_template_response
- process_template_response(self,request,response)
# 特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
执行时间((触发条件)): 视图函数之后,视图返回的是一个templateResponse对象(跟render用法类似)
参数: ,request,response
- request 和视图函数中的的request是一个对象
- response templateResponse对象
执行顺序:
- 按照注册的顺序 倒叙执行
返回值:
- HttpResponse:必须返回response对象
流程图
![1561802461972](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561802461972.png)
# 2.完整的django请求的生命周期
![1561862049120](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561862049120.png)
django小结
# 内容回顾
web框架 socket服务端
# http协议
请求的格式
“请求方式 URL路径 协议版本HTTP/1.1\r\n
k1:v1\r\n
k1v2\r\n
\r\n
请求体(请求的数据)”
响应的格式
“HTTP/1.1 状态码 状态描述\r\n
k1:v1\r\n
k1v2\r\n
\r\n
响应体(HTML页面)”
头
contentType: text/html application/json
set-cookie cookie
Location
MVC MTV
# 路由
url 和 函数的对应关系
url(正则表达式,视图,{} ,name)
分组和命名分组
路由分发 include
url的命名和反向解析
namespace
视图 CBV FBV
request
response