zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    如何通过setTimeout理解JS运行机制详解
    css3系列之伪类选择器
    css3系列之属性选择器
    css3系列之伪元素选择器
    css3系列之兄弟选择器
    作为了解系列之 预处理器 和 后处理器
    网络系列之跨域
    网络系列之 cookie增删改查(封装)
    网络系列之 jsonp 百度联想词
    网络系列之 什么是ajax 封装ajax
  • 原文地址:https://www.cnblogs.com/wangtaobiu/p/10726332.html
Copyright © 2011-2022 走看看