django 中间件操作

什么是中间件?
中间件是一个类.用来处理Django的请求和响应的框架级别的钩子
中间件的定义方法
五个方法:(process_request,process_reponse)
process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
用法:
1,引入from django.utils.deprecation import MiddlewareMixin
2,定义类,并继承MiddlewareMixin
class MD1(MiddlewareMixin):
函数
3,在setting中进行注册
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.my_middlewares.MD2', 
    'app01.my_middlewares.MD1',
]
 
1,processs_request:
1,执行时间:
在视图之前执行
2,参数:
request 和视图中的request是同一个
3,返回值:
返回None 默认 也是常用
返回reponse对象
不执行后面中间的process_request方法和视图
直接执行当前中间件的process_response方法
4,执行顺序
按照注册的顺序执行
2,process_response
1,执行时间:
在视图函数执行之后
2,request,response
request和视图中的request是同一个
response返回的response对象
3,返回值
返回response对象 必须要写
4,执行顺序:
按照注册顺序倒序
3,process_view
1,执行时间;
在视图函数之前 process_request
2,参数:
view_func 将要执行的视图含函数
view_args 视图函数的可变长位置的参数
view_kwargs 视图函数的可变长关键参数
3,返回值
返回None
返回response 不执行后面的process_view和视图
直接执行所有中间件的process_reponse方法
4,执行顺序
按照注册顺序执行
4,processs_exception(触发条件:有错误)
1,执行时间
在视图函数之后,process_response之前执行
2,参数:
exception 错误对象
3,返回值:
返回: None 不对错误进行处理 交给下一个中间件处理 如果没有交给django
返回 response 对象 下一个中间的process_exception不执行,直接执行所有中间件pricess_response
4,执行顺序:
按照注册的倒序执行
5,process_template_response(条件触发:视图返回的response有render方法)
1,执行时间
在视图函数之后,process_response之前执行
2,参数:response
3,返回值
返回response对象
4,执行顺序:
按照注册的倒序执行,执行完所有的process_template_response方法后执行
请求到达中间件之后,先按照正序执行每个注册中间件的process_reques方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应中间件的process_response方法,将HttpResponse对象返回给浏览器。也就是说:如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。
 
process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。
process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。总结所有的执行流程如下:
 
 
 
流程图
 

posted @ 2018-09-23 16:06  又见芳踪  阅读(91)  评论(0编辑  收藏  举报