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中完成激活