Django middleware 使用

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)
请我喝杯咖啡吧~