Django之中间件
中间件执行流程
我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:
也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。
中间件中可以定义4个方法,分别是:
- process_request(self,request) 发送请求
- process_view(self, request, callback, callback_args, callback_kwargs) 执行完 request 预处理函数并确定待执行的 view 之后,但在 view 函数实际执行之前。
- process_template_response(self,request,response)
- process_exception(self, request, exception) 收集错误信息
- process_response(self, request, response) 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
执行顺序也是按照以上顺序执行的.
自定义中间件
from django.shortcuts import HttpResponse
class M1: def process_request(self, request): print('M1.process_request') #如果此处有return,后面的不执行,直接返回给用户 # return HttpResponse('滚') def process_view(self, request, callback, callback_args, callback_kwargs): print('m1.process_view') def process_exception(self, request, exception): print('m1.process_exception') def process_response(self, request, response): print('M1.process_response') return response def process_template_response(self,request,response): print('template') class M2: def process_request(self, request): print('M2.process_request') def process_view(self, request, callback, callback_args, callback_kwargs): print('m2.process_view') def process_exception(self, request, exception): print('m2.process_exception') def process_response(self, request, response): print('M2.process_response') return response
中间件的注册
在django项目的settings模块中,有一个 MIDDLEWARE变量,其中每一个元素就是一个中间件,如下图:
需要注意的是顺序,因为是列表或者元组的顺序,注册时按照你既定顺序来配置
更多中间件实际用法
见此处:http://www.ziqiangxuetang.com/django/django-middleware.html