Django 中介軟體以及自定義中介軟體
阿新 • • 發佈:2022-03-10
Django中介軟體
Django中介軟體是Django的門戶
- 請求來的時候需要先經過中介軟體才能達到真正的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', ] # 均為Django中介軟體
取其中三個檢視原始碼。
from django.contrib.sessions.middleware import SessionMiddleware
from django.contrib.auth.middleware import AuthenticationMiddleware
from django.contrib.messages.middleware import MessageMiddleware
# process_request
# process_response
兩者基本所有中介軟體都具有
Django支援程式設計師自定義中介軟體並且暴露給程式設計師五個可以自定義的方法
1.process_request
2.process_response
3.process_view
4.process_template_response
5.process_exception
自定義中介軟體
如何自定義中介軟體?
- 在專案名或者應用下建立一個任意名稱的資料夾
- 在該資料夾內建立一個任意名稱的py檔案
- 在該py檔案中需要書寫類,這個類必須繼承(MiddlewareMixin)
- 需要將類的路徑以字串的形式註冊到settings配置檔案中(MIDDLEWARE)
from django.utils.deprecation import MiddlewareMixin class Mymiddleware1(MiddlewareMixin): def process_request(self, request): print('我是第一個process_request方法') def process_response(self, request,response): print('我是第一個process_response方法') return response class Mymiddleware2(MiddlewareMixin): def process_request(self, request): print('我是第二個process_request方法') def process_response(self, request,response): print('我是第二個process_response方法') return response
process_request: 請求來的時候
# process_request
1.請求來的時候需要經過每一箇中間件裡面的process_request方法,結果的順序是按照匹配檔案中註冊的中介軟體從上往下的順序一次執行。
2.如果中介軟體裡面沒有定義該方法,那麼請求將不再繼續往後執行
3.如果該方法返回了HttpResponse物件,那麼請求將不再繼續往後執行而是直接原路返回(可用作檢驗使用者是否為黑名單,校驗失敗不允許訪問等需要驗證的地方)
'process_request方法就是用來做全域性相關的所有限制功能'
process_response: 響應請求走的時候
1.響應走的時候需要經過每一箇中間件裡面的process_response方法,該方法有兩個額外的引數request,response。
2.該方法必須返回一個HttpResponse物件
2.1預設返回的就是形參request
2.2也可以返回自己的
3.順序是按照配置檔案中註冊從下往上的一次經過,如果沒有定義,直接跳過執行下一個
如果在第一個process_request方法返回HttpResponse,會怎樣?
會直接走同級別的process_request返回。