細說Django中間件 (middleware)

  • 中間件是處理django的請求和響應的框架級別的鉤子,本質是一個類(直白一點中間件是幫助咱們在視圖函數執行以前和執行以後均可以作一些額外的操做)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)

特徵

在視圖函數以前執行的中間件方法按照註冊順序執行,在視圖函數以後執行的中間件方法按照註冊順序倒序執行性能

  1. 執行時間: 在執行視圖函數以前執行
  2. 參數: request
    • request和視圖函數中的的request是一個對象
  3. 執行順序:
    • 按照註冊的順序進行執行
  4. 返回值:
    • 返回值爲none的時候,執行順序正常
    • 返回值若是是HttpResponse, 後面的中間件的process_request、視圖函數都不執行,直接執行當前中間件中的process_response方法,再倒序執行以前的中間件中process_response方法。

1.2 process_response

  • process_response(self, request, response)

特徵

在視圖函數以前執行的中間件方法按照註冊順序執行,在視圖函數以後執行的中間件方法按照註冊順序倒序執行code

  1. 執行時間: 在執行視圖函數以後執行
  2. 參數: request / response
    • request 和視圖函數中的的request是一個對象
    • response 返回給瀏覽器響應對象(不必定是視圖對象,peocess_request也會返回對象)
  3. 執行順序:
    • 按照註冊的順序,倒序執行
  4. 返回值:
    • ​ HttpResponse:必須返回response對象
  • process_request執行流程

1.3 process_view

  • process_view(self, request, view_func, view_args, view_kwargs)

特徵

在視圖函數以前執行的中間件方法按照註冊順序執行,在視圖函數以後執行的中間件方法按照註冊順序倒序執行中間件

  1. 執行時間: 視圖函數以前,process_request以後
  2. 參數: request
    • request 和視圖函數中的的request是一個對象
    • view_func 視圖函數
    • view_args 視圖函數的位置參數
    • view_kwargs 視圖函數的關鍵字參數
  3. 執行順序:
    • 按照註冊的順序進行執行
  4. 返回值:
    • 返回值爲none的時候, 執行順序正常
    • 返回值若是是HttpResponse, 後面的中間的process_view、視圖函數都不執行,直接執行註冊的最後一箇中間件中的process_response方法,再倒敘執行以前的中間中process_response方法。
  • 執行流程圖

1.4process_exception

  • process_exception(self, request, exception)

特徵

在視圖函數以前執行的中間件方法按照註冊順序執行,在視圖函數以後執行的中間件方法按照註冊順序倒序執行對象

  1. 執行時間((觸發條件)): 視圖函數以後,視圖層面有錯時才執行
  2. 參數: request/exception
    • request 和視圖函數中的的request是一個對象
    • exception 視圖中的錯誤對象
  3. 執行順序:
    • 按照註冊的順序 倒敘執行
  4. 返回值:
    • 返回值爲none的時候, 交給下一個中間件取處理異常,都沒有處理交由django處理異常
    • 返回值若是是HttpResponse, 後面的中間件的process_exception不執行,直接執行最後一箇中間件中的process_response方法,倒敘執行以前的中間中process_response方法。
  • 流程圖

1.5process_template_response

  • process_template_response(self,request,response)

特徵

在視圖函數以前執行的中間件方法按照註冊順序執行,在視圖函數以後執行的中間件方法按照註冊順序倒序執行blog

  1. 執行時間((觸發條件)): 視圖函數以後,視圖返回的是一個templateResponse對象(跟render用法相似)
  2. 參數: ,request,response
    • request 和視圖函數中的的request是一個對象
    • response templateResponse對象
  3. 執行順序:
    • 按照註冊的順序 倒敘執行
  4. 返回值:
    • HttpResponse:必須返回response對象
  • 流程圖

2.完整的django請求的生命週期

相關文章
相關標籤/搜索