Django中間件的使用

  • 2020 年 1 月 23 日
  • 筆記

Django中間件的使用

中間件(middleware)

中間件應用於request與服務端之間和服務端與response之間,客戶端發起請求到服務端接收可以通過中間件,服務端返迴響應與客戶端接收響應可以通過中間件,也就是說中間件可以處理request和response。

Django默認的中間件

在settings中Django以及默認添加了許多有用的中間件

MIDDLEWARE = [      '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',  ]

上面的配置中的中間件是有順序的,從上到下依次通過,我們自定義的中間件如果使用的話也要按照正確的順序添加到這裡

中間件中的方法

中間件中有5個方法可以定義:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

process_request

  • 客戶端發來請求與路由匹配執行之前執行
  • 返回值是None時,繼續向後執行下一個中間件的process_request或路由映射
  • 返回值是HttpResponse對象時,不執行路由與views函數,直接執行該中間件與其之前的process_response,倒序執行

process_view

  • 在執行完所有中間件的process_request與路由映射之後,views函數執行之前執行
  • 執行順序依然從第一個中間件到最後一個中間件
  • callback參數為執行的views函數
  • callback_args, callback_kwargs為views函數的參數
  • 返回值是None時,繼續向後執行下一個中間件的process_view或views函數
  • 返回值是HttpResponse對象時,不執行views函數,直接執行所有中間件的process_response,倒序執行

process_template_response

  • 視圖函數返回的對象有一個render()方法(或者表明該對象是一個TemplateResponse對象或等價方法)時,才被執行(並不是views函數最後返回render對象)
  • 在views執行之後,process_exception執行之前執行
  • 返回值必須是response
  • 倒序執行

process_exception

  • process_exception用於捕捉views函數中的異常
  • 在process_response之前執行
  • exception是views函數中產生的異常對象
  • 返回值是None時繼續正常執行
  • 返回值是HttpResponse對象:不再執行後面的process_exception方法,直接執行process_response
  • 倒序執行

process_response

  • 在response返回給客戶端之前執行,也就值最後經過
  • 必須返回HttpResponse對象

這裡要注意,在執行views函數之前的中間件的方法都是正常順序執行,views執行之後的中間件的方法是倒序執行 這裡借用https://www.jianshu.com/p/b6e65d59f508 里的圖片

定義自己的中間件

from django.utils.deprecation import MiddlewareMixin    class MyMiddleware(MiddlewareMixin):      def process_request(self, request):             print('->process_request')      def process_view(self, request, view_func, view_args, view_kwargs):          print('->view')          pass        def process_exception(self, request, exception):          pass      def process_response(self, request, response):          print('->process_response')          return response      def process_template_response(self,request,response):          print('->process_template_response')          return response

其中的方法可以不完全實現,只需要實現自己需求的方法即可 定義後別忘了在settings中完成激活