django中间件

一.什么是中间件

  "Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.

  Each middleware component is responsible for doing some specific function. For example, Django includes a middleware component,AuthenticationMiddleware, that associates users with requests using sessions."                                                                                      ------    https://docs.djangoproject.com/en/1.10/topics/http/middleware/

  可以看到,在Django接收请求到响应并返回内容的过程中中间件都存在其中,中间件相当于一个小型的插件,对Django的输入内容和输出内容都有影响.它是以类的形式存在于项目中,能在全局范围内给便django的输入和输出.

二.django中中间件的主要类型

  1.process_request(self, request) : 这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的视图函数。Django向它传入相应的Request对象,以便在方法中修改。

    执行时间:在视图执行之前

    执行顺序:按照注册顺序顺序执行

    返回值:

​       None:正常流程

​       HttpResponse对象:不执行下一个中间件中的process_request,不执行路由匹配,不执行视图,直接执行当前中间件的process_response方法。

  2.process_response(self, request, response) : 这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。该处理器能修改response 的内容,一个常见的用途是内容压缩,如gzip所请求的HTML页面.

    执行时间:在视图执行之后

    执行顺序:按照注册顺序倒叙执行

    返回值:

​       HttpResponse对象

  3.process_view(self, request, view_func, view_args, view_kwargs) : 这个方法的调用时机在 Django 执行完 request 预处理函数并确定待执行的 view (即callback参数)之后,但在 view 函数实际执行之前.

    执行时间:路由匹配之后,视图执行之前

    执行顺序:按照注册顺序顺序执行

    返回值:

      ​ None:正常流程

​       HttpResponse对象:不执行下一个中间件中的process_view,不执行视图,直接执行所有中间件中最后一个中间件的process_response方法。

  4.process_exception(self, request, exception) : 这个方法只有在 request 处理过程中出了问题并且view 函数抛出了一个未捕获的异常时才会被调用.这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复.

    执行时间:视图层面报错时执行

    执行顺序:按照注册顺序倒序执行

    返回值:

​       None:交给下一个中间件处理异常

​       HttpResponse对象:不执行下一个中间件中的process_exception,执行所有中间件中最后一个中间件的process_response方法。

  5.process_template_response(self, request, response) : 默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,而是返回视图函数 return值中render方法的结果).

    执行时间:返回的response对象是template_response,或者response对象有一个render的方法

    执行顺序:按照注册顺序倒序执行

    返回值:

​       HttpResponse对象

  6.django中从请求到响应的过程 :

三.自定义中间件

  自定义中间件时,注意要在settings中注册,否则不会生效.

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class MD1(MiddlewareMixin):

    def process_request(self, request):
        print('MD1 process_request')

    def process_response(self, request, response):
        print('MD1 process_response')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print('MD1 process_view')

    def process_exception(self, request, exception):
        print('MD1 process_exception')

class MD2(MiddlewareMixin):

    def process_request(self, request):
        print('MD2 process_request')

    def process_response(self, request, response):
        print('MD2 process_response')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print('MD2 process_view')

结果 : 

MD1 process_request
MD2 process_request
MD1 process_view
MD2 process_view
MD2 process_response
MD1 process_response

  

 

posted @ 2019-04-17 21:29  屁桃  阅读(166)  评论(0编辑  收藏  举报