好程式設計師Python培訓之Django中介軟體基礎用法詳解

好程式設計師發表於2020-09-30

  好程式設計師Python 培訓之 Django 中介軟體基礎用法詳解,首先 django 的中介軟體可以在檢視函式執行前執行,比如登陸驗證、日誌記錄等,下面簡單說明一下中介軟體的基礎用法吧。

 

1. django 專案資料夾下建立一個用於存放中介軟體函式的資料夾

 

資料夾的名字可自定義,本文使用utils 作為資料夾名

 

2. utils 資料夾中建立中介軟體 py 檔案

 

如用於登陸驗證的中介軟體loginCheck.py

 

from django.http import HttpResponseRedirect

from django.utils.deprecation import MiddlewareMixin

 

class UserLoginCheck(MiddlewareMixin):

  '''

   登入驗證中介軟體

  '''

  def process_request(self, request):

    # 使用者 request 請求前

    path = ['/login/', '/logout/'] # 不需要進行登入檢測的 url

    if request.path in path:

      return

 

    userinfoSession = request.session.get('userinfo')

    if not userinfoSession:

      return HttpResponseRedirect('/login/')

    return

 

3. 配置使用中介軟體

 

setting.py 檔案中配置中介軟體

 

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',

  'utils.loginCheck.UserLoginCheck', # 此處為自定義的中介軟體

]

 

擴充套件

 

中介軟體可定義的五種方法

 

Request 預處理函式 :process_request(self,request)

 

這個方法的呼叫時機在Django 接收到 request 之後,但仍未解析 URL 以確定應當執行的檢視函式。 Django 向它傳入相應的 Request 物件,以便在方法中修改。

 

如果返回None Django 將繼續處理這個 request ,執行後續的中介軟體,然後呼叫相應的 view

 

如果返回HttpResponse 物件, Django 將不再執行任何除了 process_response 以外其它的中介軟體以及相應的 view Django 將立即返回該 HttpResponse

 

View 預處理函式 :process_view(self,request,callback,callback_args,callback_kwargs)

 

這個方法的呼叫時機在Django 執行完 request 預處理函式並確定待執行的 view (即 callback 引數)之後,但在 view 函式實際執行之前。

 

request HttpRequest 物件。

 

callback Django 將呼叫的處理 request python 函式 . 這是實際的函式物件本身 , 而不是字串表述的函式名。

 

args :將傳入 view 的位置引數列表,但不包括 request 引數 ( 它通常是傳入 view 的第一個引數 )

 

kwargs :將傳入 view 的關鍵字引數字典。

 

process_view() 應當返回 None HttpResponse 物件。如果返回 None Django 將繼續處理這個 request ,執行後續的中介軟體,然後呼叫相應的 view

 

如果返回HttpResponse 物件, Django 將不再執行任何其它的中介軟體 ( 不論種類 ) 以及相應的 view Django 將立即返回。

 

Template 模版渲染函式: process_template_response()

 

預設不執行,只有在檢視函式的返回結果物件中有render 方法才會執行,並把物件的 render 方法的返回值返回給使用者(注意不返回檢視函式的 return 的結果了,而是返回檢視函式 return 值(物件)中 rende 方法的結果)

 

Exception 後處理函式 :process_exception(self,request,exception)

 

這個方法只有在request 處理過程中出了問題並且 view 函式丟擲了一個未捕獲的異常時才會被呼叫。這個鉤子可以用來傳送錯誤通知,將現場相關資訊輸出到日誌檔案,或者甚至嘗試從錯誤中自動恢復。

 

這個函式的引數除了一貫的request 物件之外,還包括 view 函式丟擲的實際的異常物件 exception

 

process_exception() 應當返回 None HttpResponse 物件。

 

如果返回None Django 將用框架內建的異常處理機制繼續處理相應 request

 

如果返回HttpResponse 物件, Django 將使用該 response 物件,而短路框架內建的異常處理機制。

 

Response 後處理函式 :process_response(self,request,response)

 

這個方法的呼叫時機在Django 執行 view 函式並生成 response 之後。

 

該處理器能修改response 的內容;一個常見的用途是內容壓縮,如 gzip 所請求的 HTML 頁面。

 

這個方法的引數相當直觀:request request 物件,而 response 則是從 view 中返回的 response 物件。

 

process_response() 必須返回 HttpResponse 物件 . 這個 response 物件可以是傳入函式的那一個原始物件(通常已被修改),也可以是全新生成的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2725228/,如需轉載,請註明出處,否則將追究法律責任。

相關文章