有些場合,需要對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物件,以便在方法中修改。
view預處理函式: process_view(self, request, view, args, kwargs)
這個方法的呼叫時機在django執行完request預處理函式並確定待執行的view之後,但在view函式實際執行之前。
response後處理函式: process_response(self, request, response)
這個方法呼叫時機在django執行view函式並生成response之後。
request是request物件,而response則是從view中返回的response物件。必須返回httprequest物件,這個response物件可以是傳入函式的那乙個原始物件,也可以是全新生成的。
exception後處理函式: process_exception(self, request, exception)
這個方法只有在requst處理過程中出了問題並且view函式跑出乙個未捕獲的異常時才會會被呼叫。這個鉤子可以用來傳送錯誤通知,將現場相關資訊輸出到日誌檔案,或者甚至嘗試從錯誤中自動恢復。
認證中介軟體
中介軟體類: 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')
)
django.middleware.gzip.gzipmiddleware
這個中介軟體自動為能處理gzip壓縮的瀏覽器自動壓縮返回內容。這將極大地減少web伺服器所耗用的頻寬。代價是壓縮頁面需要一些額外的處理時間。
條件化get中介軟體
這個中介軟體對條件化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函式一致的事務機制的控制下。
Django 中介軟體
django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的執行過程如下圖所示 django在中介軟體中預置了五個方法,這五個方法的區別在於不同的階段執行,對輸入或輸出進行干預,方法如下 def init self pa...
Django中介軟體
給檢視函式加裝飾器判斷使用者是否登入,把沒有登入的請求跳轉到登入頁面,我們通過給幾個特定檢視函式加裝飾器實現了這個需求,但是這樣做比較繁瑣,用django中的中介軟體會比較簡潔 什麼是中介軟體 中介軟體是幫助我們再檢視函式執行之前和執行之後都可以做一些額外的操作,它本質上就是乙個自定義類,類中定義了...
Django中介軟體
什麼是中介軟體?django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的設計為開發者提供了一種無侵入式的開發方式,增強了django框架的健壯性。我們可以使用中介軟體,在django處理檢視的不同階段對輸入或輸出進行...