天天看點

【Django】中間件

"

@

目錄

  • 什麼是中間件?
  • 自定義中間件
    • 示例
  • 中間件的五種方法
    • process_request
    • process_response
    • process_view
    • process_exception
    • process_template_response
  • 中間件的執行流程
  • Django請求流程圖

我們可以給視圖函數加裝飾器來判斷是使用者是否登入,把沒有登入的使用者請求跳轉到登入頁面等等。我們通過給幾個特定視圖函數加裝飾器實作了這個需求,但是以後添加的視圖函數可能也需要加上裝飾器,這樣是不是稍微有點繁瑣。

是以,我們可以使用更适宜的方式來實作類似給所有請求都做相同操作的功能了——中間件.

官方的說法:

中間件是一個用來處理Django的請求和響應的架構級别的鈎子。它是一個輕量、低級别的插件系統,用于在全局範圍内改變Django的輸入和輸出。每個中間件元件負責做一些特定的功能。

由于其影響的是全局,是以需要謹慎使用,使用不當會影響性能。

說的直白一點,中間件可以幫助我們在視圖函數執行之前和執行之後做一些額外的操作。

它的本質是一個自定義類,類中定義了幾個方法,Django架構會在請求的特定時間去執行這些方法。

打開Django項目的Settings.py檔案,看到下圖的MIDDLEWARE配置項:

【Django】中間件

MIDDLEWARD配置項是一個清單,清單中是一個個字元串,這些字元串其實是一個個類,也就是一個個中間件。

中間件可以定義五種方法,分别是:

  1. process_request(self, request)
  2. process_view(self, request, view_func, view_args, view_kwargs)
  3. process_template_response(self, request, response)
  4. process_exception(self, request, exception)
  5. process_response(self, request, response)

以上方法的傳回值可以是None,或者是一個HttpResponse對象,如果是None,則繼續按照django定義的規則向後繼續執行,如果是HttpResponse對象,則直接将改對象傳回給使用者。

重點了解process_request 與 process_response.

from django.utils.deprecation import MiddlewareMixin


class MD1(MiddlewareMixin):

    def process_request(self, request):
        print("我是MD1的process_request方法")

    def process_response(self, request, response):
        print("我是MD1的process_response方法")
        return response


class MD2(MiddlewareMixin):

    def process_request(self, request):
        print("我是MD2的process_request方法")

    def process_response(self, request, response):
        print("我是MD2的process_response方法")
        return response
           

在settings.py配置檔案中的MIDDLEWARE配置項加上自定義的中間件:app名稱.檔案名.類名

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',
    # 自定義中間件(注意順序)
    'untitled01.my_middlewares.MD1',
    'untitled01.my_middlewares.MD2',
]
           

執行時間:

在視圖函數之前,在路由比對之前

·

參數:

request:請求對象,與視圖中用到的request參數是同一個對象

傳回值:

None:按照正常的流程走

HttpResponse:接着倒序執行目前中間件的以及之前執行過的中間件的process_response方法,不再執行其它的所有方法

執行順序:

按照MIDDLEWARE中的注冊的順序執行,也就是此清單的索引值

最後執行

response:響應對象,與視圖中傳回的response是同一個對象

response:必須傳回此對象,按照正常的流程走

按照注冊的順序倒序執行

在process_request方法及路由比對之後,視圖之前

view_func:将要執行的視圖函數(它是實際的函數對象,而不是函數的名稱作為字元串)

view_args:url路徑中将傳遞給視圖的位置參數的元組

view_kwargs:url路徑中将傳遞給視圖的關鍵值參數的字典

HttpResponse:它之後的中間件的process_view,及視圖不執行,執行所有中間件的process_response方法

按照注冊的順序執行

此方法隻在視圖中觸發異常時才被執行.

視圖之後,process_response之前

exception:視圖函數異常産生的Exception對象

HttpResponse對象:不再執行後面的process_exception方法

此方法必須在視圖函數傳回的對象有一個render()方法(或者表明該對象是一個TemplateResponse對象或等價方法)時,才被執行.

render()方法用于傳回一個HTML頁面.

視圖之後,process_exception之前

response:是TemplateResponse對象(由視圖函數或者中間件産生)