详解Django中间件执行顺序

  

  

Django中的中间件是一个轻量级,底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

  

我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

  

  

定义一个中间件工厂函数,然后返回一个可以别调用的中间件。

  

中间件工厂函数需要接收一个可以调用的get_response对象。

  

返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个请求对象参数,返回一个响应对象。

        def simple_middleware (get_response):   #此处编写的代码仅在Django第一次配置和初始化的时候执行一次。      def中间件(请求):   #此处编写的代码会在每个请求处理视图前被调用。      响应=get_response(请求)      #此处编写的代码会在每个请求处理视图之后被调用。      返回响应      返回中间件      

例如,在用户应用中新建一个middleware.py文件,

        def my_middleware (get_response):   打印(“init被调用”)   def中间件(请求):   打印(之前请求被调用”)   响应=get_response(请求)   打印(后响应被调用”)   返回响应   返回中间件      

定义好中间件后,需要在设置。py文件中添加注册中间件

        中间件=[   “django.middleware.security.SecurityMiddleware”,   “django.contrib.sessions.middleware.SessionMiddleware”,   “django.middleware.common.CommonMiddleware”,   #“django.middleware.csrf.CsrfViewMiddleware”,   “django.contrib.auth.middleware.AuthenticationMiddleware”,   “django.contrib.messages.middleware.MessageMiddleware”,   “django.middleware.clickjacking.XFrameOptionsMiddleware”,   “users.middleware。my_middleware”, #添加中间件   )      

定义一个视图进行测试

        def demo_view(请求):   print(的观点视图被调用的)   返回HttpResponse(“好”)      

执行结果

  

详解Django中间件执行顺序

  

注意:Django运行在调试模式下,中间件init部分有可能被调用两次。

  

  

详解Django中间件执行顺序

  

  
      <李>在请求视图被处理前,中间件由上至下依次执行   <李>在请求视图被处理后,中间件由下至上依次执行   
  

详解Django中间件执行顺序

  

示例:   

定义两个中间件

        def my_middleware (get_response):   打印(“init被调用”)   def中间件(请求):   打印(之前请求被调用”)   响应=get_response(请求)   打印(后响应被调用”)   返回响应   返回的中间件      def my_middleware2 (get_response):   打印(“init2被调用”)   def中间件(请求):   打印(之前请求2被调用的)   响应=get_response(请求)   打印(后反应2被调用的)   返回响应   返回中间件      

注册添加两个中间件

        中间件=[   “django.middleware.security.SecurityMiddleware”,   “django.contrib.sessions.middleware.SessionMiddleware”,   “django.middleware.common.CommonMiddleware”,   #“django.middleware.csrf.CsrfViewMiddleware”,   “django.contrib.auth.middleware.AuthenticationMiddleware”,   “django.contrib.messages.middleware.MessageMiddleware”,   “django.middleware.clickjacking.XFrameOptionsMiddleware”,   “users.middleware。my_middleware”, #添加   “users.middleware。my_middleware2”, #添加   )      

执行结果

  
  

init2被调用
  init被调用
  前请求被调用
  前请求2被调用
  观点视图被调用
  反应2后被调用
  反应后被调用

     

总结:中间件的本质其实就是个装饰器,对于装饰器我之前的随笔里也详细说过,装饰器的本质其实就是个闭包

详解Django中间件执行顺序