django中间件是一个类,在请求到来和结束后,django会根据自己的规则在合适的的时机执行中间件中对应的方法。请求传递到django的过程如下:
请求都是先通过中间件的process_request函数,这个函数返回None或者HttpResponse对象,如果返回前者继续处理其他中间件,如果返回一个HttpResponse,就处理中止,返回到网页上。
在settings.py中可以查看django中的中间件,也可以自定义中间件,自定义中间件需继承MiddlewareMixin,需要导入
from django.utils import deprecation
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', 'mymiddle.mymiddleware.MyMiddle', 'mymiddle.mymiddleware.MyMiddle2', ]
在app目录下新建mymiddle文件夹,创建mymiddleware.py
from django.http.response import HttpResponse from django.utils import deprecation class MyMiddle(deprecation.MiddlewareMixin): def process_request(self,request): print('1.process_request') def process_view(self,request,callback,callback_args,callback_kwargs): print('1.process_view') def process_exception(self,request,exception): print('1.process_exception') def process_response(self,request,response): print('1.process_response') return response class MyMiddle2(deprecation.MiddlewareMixin): def process_request(self,request): print('2.process_request') def process_view(self,request,callback,callback_args,callback_kwargs): print('2.process_view') def process_exception(self,request,exception): print('2.process_exception') def process_response(self,request,response): print('2.process_response') return response
运行效果
可以看到请求的流程
当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。
总结:
中间件中定义的方法:
process_request(self,request)
process_view(self,request,callback,callback_args,callback_kwargs)
process_exception(self,request,exception) //当views的函数中出现错误时,就会执行process_exception方法
process_response(self,request,response)
process_template_response(self,request,response) //只有当views函数中返回的对象中具有render方法,是就会直接process_template_responseprocess
参考链接:
https://www.cnblogs.com/zhaof/p/6281541.html
https://www.cnblogs.com/xone/p/6734408.html