文章目錄
- 一、中間件的介紹
- 中間件有什么用
- 中間件功能
- 自定義中間
- 中間件的順序
一、中間件的介紹
中間件顧名思義,是介于request與response處理之間的一道處理過程,相對比較輕量級,并且在全局上改變django的輸入與輸出。因為改變的是全局,所以需要謹慎實用,用不好會影響到性能
中間件流程圖
中間件有什么用
如果你想修改請求,例如被傳送到view中的HttpRequest對象。 或者你想修改view返回的HttpResponse對象,這些都可以通過中間件來實現。
可能你還想在view執行之前做一些操作,這種情況就可以用 middleware來實現。
Django默認的中間件:(在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件,如下圖)
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',
]
這七個中間件程序會在請求來時自上而下依次的處理request請求,在響應走時自下而上依次處理response響應。
中間件功能
網站訪問頻率的校驗 用戶權限的校驗等全局類型的功能需求
前期我們要訪問post請求,中間件的第四個字符串妨礙了簡單post請求,初期階段我們將其注釋掉了
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',
]
這七個字符串實際上對應的是中間件程序存儲的路徑
我們順著路徑的文件,點進去可知源碼
由上述圖可知
1.七個中間件都繼承了MiddlewareMixin類
2.都幾乎有process_request和process_response函數
3.都必須傳入參數
process_request需要傳入request參數;
process_response需要傳入request和response兩個參數,必須返回response。
自定義中間
如何自定義中間件
1.創建存儲自定義中間件代碼的py文件或者目錄(如果中間件很多)
2.參考自帶中間件的代碼編寫類并繼承
3.在類中編寫五個可以自定義的方法
4.一定在配置文件中注冊中間件才可以生效
編寫自定義的中間件(在mymiddlie中編寫MyMiddleware001)
編寫好中間件,一定要去settings里的Middleware中注冊自定義的中間件
中間件的順序
我們只是定義了process_reqtest和process_response函數,我們想看看執行的順序的,我們可以做一個小測試
mymiddle.py(自定義的中間件)
from django.utils.deprecation import MiddlewareMixinclass MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')def process_response(self,request,response):print('from MyMiddleware001 process_response')return responseclass MyMiddleware002(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware002 process_request')def process_response(self,request,response):print('from MyMiddleware002 process_response')return response
當我們從網頁向URL發送請求時,請求通過了網關接口到達了中間件,在中間件的執行過程是自上而下,從而經過路由層>>視圖層>>>等,當響應是經過中間件的時候是自下而上的,返回給網關接口,再打包給瀏覽器,
打印結果
如果我們還想測試如果遇到HttpResponse對象,會怎么樣?看下面的解釋
django中間件兩個基本方法
process_request
1.請求來的時候會從上往下依次經過每一個注冊的中間件里面的該方法 如果沒有則直接跳過
2.如果該方法自己返回了HttpResponse對象那么不再往后執行而是直接原路返回
如果請求遇到了process_request方法,該方法返回了HttpResponse對象,如下
class MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')return HttpResponse('你沒有權限執行下面的中間件') # 遇到了HttpResponse對象def process_response(self,request,response):print('from MyMiddleware001 process_response')return response
他經過的行徑如黃色箭頭,請求通過網關到中間件自上而下到達了中間件MyMiddleware001,就會直接執行MyMiddleware001的process_response方法,直接原路返回,不會走下面的中間件MyMiddleware002。
process_response
1.響應走的時候會從下往上依次經過每一個注冊了的中間件里面的該方法 如果沒有則直接跳過
2.該方法有兩個先request和response 形參response指代的就是后端想要返回給前端瀏覽器的數據 該方法必須返回該形參 也可以替換from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
class MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')def process_response(self,request,response):print('from MyMiddleware001 process_response')# return responsereturn HttpResponse('中間1直接返回了,返回了response')
注意:
1.一個請求經過了中間件,如果在執行process_request方法的時候直接返回了HttpResponse對象那么會原路返回執行自定義中間件的process_response 不是執行所有。
? 2.在flask中,是從最底層中間程序的響應函數開始執行的
django中間件三個了解得方法
1.process_view路由匹配成功之后執行視圖函數/類之前自動觸發(順序同process_request)
2.process_exception視圖函數/類執行報錯自動觸發(順序同process_response)
3.process_template_response視圖函數/類返回的HttpResponse對象含有render并且對應一個方法的時候自動觸發(順序同process_response)