前言
中间件源码分析
1、中间件总体流程图
中间件流程:定义类 ==> 定义类中的方法 ==> settings.py文件中对中间件进行注册
2、原始方式
2.1 新建middleware文件
定义类:MyMd()及方法
2.2 注册
3、开发使用时建议继承MiddlewareMixin
源码:
-
面向对象
class MyMd(object): def __init__(self....): pass # django内部默认执行call方法,传入参数。 def __call__(self,....): pass
-
反射
class MiddlewareMixin: def __init__(self, get_response=None): self.get_response = get_response # django内部默认执行call方法,传入参数。 def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) response = response or self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response # 项目开发时进行配置的部分process_request、process_response class MyMd(MiddlewareMixin): def process_request(self,request): ... def process_response(self,request, response): ...
-
流程图
要点:
- process_request:方法如果有返回值,则流程终止于当前,后续中间件不会再走,不会进入到视图函数;返回流程详见蓝色箭头线;
- process_reponse:方法必定有返回值;
4、process_view相关
- process_view是在django中源码中写死了;
- prcess_request执行时,进行了路由匹配,中间件方法执行request.resolver_match时,返回True;但是代码流程还未进入到视图函数阶段,视图函数中执行request.resolver_match获取不到值;
5、总结
- process_request,进入视图函数前执行一些操作,如设置访问黑白名单等;
- process_view,进入视图函数中执行一些操作,如用户登录后,保存用户信息等;
- process_reponse,返回数据到浏览器前执行一些操作,如果进行跨域配置添加响应头信息等;
- process_exception,视图函数出现异常,自定义异常页面;
- process_template_response,视图函数返回
TemplateResponse
对象 or 对象中含有.render方法。