Django 中间件是 Django 框架里面很重要的一个东西。session 管理、防止 csrf 攻击都是靠中间件完成。
中间件有几个值得注意的地方:
中间类型分为5种,process_request(请求中间件) 、process_view (视图中间件)、process_template_response (模板中间件)、process_response (响应中间件) 、process_exception (异常中间件)
中间类型的执行顺序在 django.core.handler.base.py 文件里面可以看到,BaseHandler 类的 get_response 方法。
当一个请求过来,首先调用 process_exception 中间件处理请求,然后根据 URL 进行匹配,在处理 process_exception 中间件。
响应产生之后,执行顺序是 process_exception、process_response 、process_template_response
process_template_response(request, response)方法,request 就是 HttpRequest object,而 response 是 TemplateResponse object,或者是 SimpleTemplateResponse 的子类,因为SimpleTemplateResponse 实现了 render 方法。这种类型的中间件必须要响应对象实现 render 方法。
多个中间件的执行顺序:请求传入的时候按照 settings 文件中配置的 MIDDLEWARE_CLASSES 元组的顺序,响应传出的时候是按照 MIDDLEWARE_CLASSES 的逆序
1 | if hasattr(mw_instance, 'process_request'): request_middleware.append(mw_instance.process_request) if hasattr(mw_instance, 'process_view'): self._view_middleware.append(mw_instance.process_view) if hasattr(mw_instance, 'process_template_response'): self._template_response_middleware.insert(0, mw_instance.process_template_response) if hasattr(mw_instance, 'process_response'): self._response_middleware.insert(0, mw_instance.process_response) if hasattr(mw_instance, 'process_exception'): self._exception_middleware.insert(0, mw_instance.process_exception) |