文章目錄
Django有一個功能是中間件,他可以在不改變現有代碼的情況下,對請求或者相應等附加一些額外的操作,最常用的功能比如有登陸驗證、過濾名單、日志記錄等場景。
簡介
本質上其實是一個hook鉤子,在request到來或者response通過的時候會觸發,根據相應規則進行修改。
如果看Django項目的settings.py
,可以看到裡面有一向是MIDDLEWARE
裡面就注冊了當前使用的一些中間件,如下所示
- django.middleware.security.SecurityMiddleware:一些安全防護機制
- django.middleware.common.CommonMiddleware:提供了對URL的重寫,基於
APPEND_SLASH和PREPEND_WWW
,前者如果為True,如果一個沒有末尾斜槓的URL沒有匹配的時候會自動加一個斜槓重新匹配;如果後者為True,如果一個沒有www.開頭的URL沒有匹配到,會自動加一個www.重新匹配 - django.middleware.csrf.CsrfViewMiddleware:啟動CSRF防護,會自動給返回前端的網頁模板中添加一個csrf隱藏控件,value是一個隨機生成的字符串,提交表單的時候會附帶這個token給後端,後端會驗證csrf token是否合法,避免惡意偽造攻擊
- django.contrib.sessions.middleware.SessionMiddleware:啟動session功能,在項目中可以使用session
- django.contrib.auth.middleware.AuthenticationMiddleware:使用會話將用戶與請求關聯起來
Django中間件繼承自django.utils.deprecation.MiddlewareMixin
提供了五個方法其實,至少需要實現其中一個
- process_request(self,request):request到來路由匹配之前,正常返回None;異常返回HttpResponse
- process_view(self,request,callback,callback_args,callback_kwargs):callback是視圖函數,後面args是位置參數,這個是路由匹配後視圖函數被調用之前觸發的,用於代碼層面的替換和過濾,這裡可以拿到視圖函數的參數,正常返回None;異常返回HttpResponse
- process_response(self,request,response):在相應從服務器發出之前觸發,正常返回None;異常返回HttpResponse
- process_exception(self,request,exception):出現異常的時候會被調用,異常返回HttpResponse
- process_template_response(self,request,response):試圖函數執行完成,主要是render方法,實現了render方法的響應對象。正常返回None;異常返回HttpResponse
如果正常進入下一步的話,都是返回None的,就是不寫返回值直接return
自定義Django中間件
比如我現在的需求是需要添加我自己的一個登陸驗證功能,我其實可以通過裝飾器實現,也可以通過在代碼最前面驗證session,但是我不止一個函數需要這麼做,如果對所有函數這麼操作,會非常麻煩,中間件的作用就凸顯出來了,只需要一個中間件,他就可以管理到所有的函數方法。
首先創建一個app叫middleware
,在裡面創建一個python文件login.py
,在裡面創建一個類LoginMiddleware
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
import re
class LoginMiddleware(MiddlewareMixin):
count_dict = {
} #創建用於統計次數的字典
def process_request(self,request):
print('這是我的中間件')
return
然後修改settings.py
文件,在修改如下,添加中間件和app
INSTALLED_APPS = [
...
'middleware'
]
MIDDLEWARE = [
...
'middleware.login.LoginMiddleware',
]
然後啟動服務即可