-
中間件是處理django的請求和響應的框架級別的鈎子,本質是一個類(直白一點中間件是幫助我們在視圖函數執行之前和執行之后都可以做一些額外的操作)
-
由於其影響的是全局,所以需要謹慎使用,使用不當會影響性能。
-
定義的中間件需要注冊
-
django中請求響應流程
1.中間件定義的五個方法:
- process_request(self,request)
- process_response(self, request, response)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_exception(self, request, exception)
- process_template_response(self,request,response)
1.1 process_request
- process_request(self,request)
特征
在視圖函數之前執行的中間件方法按照注冊順序執行,在視圖函數之后執行的中間件方法按照注冊順序倒序執行
- 執行時間: 在執行視圖函數之前執行
- 參數: request
- request和視圖函數中的的request是一個對象
- 執行順序:
- 按照注冊的順序進行執行
- 返回值:
- 返回值為none的時候,執行順序正常
- 返回值如果是HttpResponse, 后面的中間件的process_request、視圖函數都不執行,直接執行當前中間件中的process_response方法,再倒序執行之前的中間件中process_response方法。
1.2 process_response
- process_response(self, request, response)
特征
在視圖函數之前執行的中間件方法按照注冊順序執行,在視圖函數之后執行的中間件方法按照注冊順序倒序執行
- 執行時間: 在執行視圖函數之后執行
- 參數: request / response
- request 和視圖函數中的的request是一個對象
- response 返回給瀏覽器響應對象(不一定是視圖對象,peocess_request也會返回對象)
- 執行順序:
- 按照注冊的順序,倒序執行
- 返回值:
- HttpResponse:必須返回response對象
- process_request執行流程
1.3 process_view
- process_view(self, request, view_func, view_args, view_kwargs)
特征
在視圖函數之前執行的中間件方法按照注冊順序執行,在視圖函數之后執行的中間件方法按照注冊順序倒序執行
-
執行時間: 視圖函數之前,process_request之后
-
參數: request
- request 和視圖函數中的的request是一個對象
- view_func 視圖函數
- view_args 視圖函數的位置參數
- view_kwargs 視圖函數的關鍵字參數
-
執行順序:
- 按照注冊的順序進行執行
-
返回值:
- 返回值為none的時候, 執行順序正常
- 返回值如果是HttpResponse, 后面的中間的process_view、視圖函數都不執行,直接執行注冊的最后一個中間件中的process_response方法,再倒敘執行之前的中間中process_response方法。
- 執行流程圖
1.4process_exception
- process_exception(self, request, exception)
特征
在視圖函數之前執行的中間件方法按照注冊順序執行,在視圖函數之后執行的中間件方法按照注冊順序倒序執行
-
執行時間((觸發條件)): 視圖函數之后,視圖層面有錯時才執行
-
參數: request/exception
- request 和視圖函數中的的request是一個對象
- exception 視圖中的錯誤對象
-
執行順序:
- 按照注冊的順序 倒敘執行
-
返回值:
- 返回值為none的時候, 交給下一個中間件取處理異常,都沒有處理交由django處理異常
- 返回值如果是HttpResponse, 后面的中間件的process_exception不執行,直接執行最后一個中間件中的process_response方法,倒敘執行之前的中間中process_response方法。
- 流程圖
1.5process_template_response
- process_template_response(self,request,response)
特征
在視圖函數之前執行的中間件方法按照注冊順序執行,在視圖函數之后執行的中間件方法按照注冊順序倒序執行
-
執行時間((觸發條件)): 視圖函數之后,視圖返回的是一個templateResponse對象(跟render用法類似)
-
參數: ,request,response
- request 和視圖函數中的的request是一個對象
- response templateResponse對象
-
執行順序:
- 按照注冊的順序 倒敘執行
-
返回值:
- HttpResponse:必須返回response對象
- 流程圖