1. 程式人生 > >Django開發——中介軟體

Django開發——中介軟體

有些場合,需要對Django處理的每個request都執行某段程式碼,這類程式碼可能是在view處理之前修改傳入的request,或者記錄日誌資訊以便用於除錯。這類功能可以用Django的中介軟體框架來實現。
安裝中介軟體
要啟用一箇中間件,只需將其新增到配置模組的MIDDLEWARE中,其中中介軟體用字元表示:指向中介軟體雷鳴的完整Python路徑。這裡中介軟體出現的順序非常重要。在request和view的處理階段,Django按照MIDDLEWARE中出現的順序來應用中介軟體,而在request和異常處理階段,Django則按逆序來呼叫它們。也就是說Django將MIDDLEWARE時為view函式外層的順序包裝:在request階段按順序從上到下,而response則反過來。

中介軟體方法

Initializer:init(self)[初始化]
用於執行系統範圍的設定。出與效能的考慮。每個已啟用的中介軟體在每個伺服器程序中只初始化一次,所以,**init()僅在服務程序啟動時候呼叫,而在針對單個request處理時並不執行。定義init()**方法的通常原因是檢查自身的必要性。
Requesth預處理函式:process_request(self,request)
這個方法的呼叫時機在Django接收到request之後,但未解析URL以確定應當執行的view之前。Django向它傳入相應的HttpRequest物件,以便在方法中修改。

  • 如果返回None,Django將繼續處理這個request執行後續的中介軟體,然後呼叫相應的view。
  • 如果返回HttpResponse物件,Django將不再執行任何其他中介軟體以及相應的view。Django將立即返回該HttpResponse。

View預處理函式: process_view(self, request, view, args, kwargs)
這個方法的呼叫時機在Django執行完request預處理函式並確定待執行的view之後,但在view函式實際執行之前。

  • 如果返回None,Django將繼續處理這個request執行後續的,然後呼叫相應的view。
  • 如果返回HttpResponse物件,Django將不再執行任何其他中介軟體以及相應的view。Django將立即返回該HttpResponse。

Response後處理函式: process_response(self, request, response)
這個方法呼叫時機在Django執行view函式並生成response之後。
request是request物件,而response則是從view中返回的response物件。必須返回HttpRequest物件,這個response物件可以是傳入函式的那一個原始物件,也可以是全新生成的。
Exception後處理函式: process_exception(self, request, exception)
這個方法只有在requst處理過程中出了問題並且view函式跑出一個未捕獲的異常時才會會被呼叫。這個鉤子可以用來發送錯誤通知,將現場相關資訊輸出到日誌檔案,或者甚至嘗試從錯誤中自動恢復。

  • 如果返回None,Django將用框架內建的異常處理機制繼續處理相應request;
  • 如果返回HttpResponse物件,Django將使用該response物件,而短路框架內建得一回藏處理機制。

內建的中介軟體

認證中介軟體
中介軟體類: django.contrib.auth.middleware.AuthenticationMiddleware .
這個中加件啟用認證支援功能,他在每個傳入的HttpRequest物件中新增代表當前登入使用者的request.user屬性。
通用中介軟體
Middleware class: django.middleware.common.CommonMiddleware
禁止"DISALLOWED_USER_AGENTS"列表中所設定的user agent訪問:一旦提供,這一列表應當由已編譯的正則表示式物件組成,這些物件用於匹配傳入的request請求頭中的user-agent域。

import re
DISALLOWED_USER_AGENTS = (
re.compile(r'^OmniExplorer_Bot'),
re.compile(r'^Googlebot')
)

依據“APPEND_SLASH”和"PREPEND_WWW"的設定執行URL重寫:如果APPEND_SLASH為True,那些尾部沒有斜槓的URL將被重定向到添加了斜槓的相應URL,除非path的最末組成部分包含點號。如foo.com/bar 會被重定向到 foo.com/bar/ , 但是 foo.com/bar/file.txt 將以不變形式通過。
如果PREPEND_WWW為True,那些缺少先導www.的URLs將會被重定向到含有先導www.相應URL上。
這兩個選項都是為了規範化URL。
依據"USE_ETAGS"的設定處理Etag:ETags是HTTP級別上按條件快取頁面的優化機制。如果user_ETAGS為True,D激昂哦針對每個請求以MD5演算法處理頁面內容,從而得到Etag,在此基礎上,Django將在適當情形下處理並返回Not Modified迴應。
壓縮中介軟體
django.middleware.gzip.GZipMiddleware
這個中介軟體自動為能處理gzip壓縮的瀏覽器自動壓縮返回內容。這將極大地減少Web伺服器所耗用的頻寬。代價是壓縮頁面需要一些額外的處理時間。
條件化GET中介軟體
django.middleware.http.ConditionalGetMiddleware

這個中介軟體對條件化GET操作提供支援。如果response頭中包括Last-Modified或ETag域,並且request頭中包含If‐None‐Match 或 If‐Modified‐Since 域,且兩者以只,則該response將被response 304取代。此外它也將刪除處理HEAD request時所生成的response中的任何內容,並在所有request的response頭中設定Date和Content-Length域。
反向代理
在 request.META[‘HTTP_X_FORWARDED_FOR’] 存在的前提下,
它根據其值來設定 request.META[‘REMOTE_ADDR’] 。在站點位於某個反向代理之後的、每個request的REMOTE_ADDR 都被指向 127.0.0.1 的情形下,這一功能將非常有用。
這個中介軟體並不驗證HTTP_X_FORWARDED_FOR的合法性。如果站點並不位於自動設定HTTP_X_FORWARDED_FOR的反向代理之後,請不要使用這個中介軟體。否則,因為任何人都能偽造HTTP_X_FORWARDED_FOR的值,而REMOTE_ADDR來設定,這意味著任何人都能偽造IP地址,只有當能夠絕對信任HTTP_X_FORWARDED_FOR值的時候才能夠使用。
會話支援中介軟體
django.contrib.sessions.middleware.SessionMiddleware
啟用會話支援功能
站點支援中介軟體
django.middleware.cache.UpdateCacheMiddleware
django.middleware.cache.FetchFromCacheMiddleware
這些中介軟體互相配合以快取每個基於Django的頁面。
事務處理中介軟體
django.middleware.transaction.TransactionMiddleware
這個中介軟體將資料庫的COMMT或ROLLBACK繫結到request/response處理階段。如果view函式成功執行。則發出COMMIT指令。如果view函式丟擲異常,則發出BOLLBACK指令。這個中介軟體在棧中的順序非常重要。其外層的中介軟體模組執行在Django預設的 儲存——提交行為模式下,而其內層中介軟體愛你將置於與view函式一致的事務機制的控制下。