簡介Django中內置的一些中間件

認證支持中間件

中間件類: django.contrib.auth.middleware.AuthenticationMiddleware . django.contrib.auth.middleware.AuthenticationMiddleware .

這個中間件激活認證支持功能. 它在每個傳入的 HttpRequest 對象中添加代表當前登錄用戶的 request.user 屬性。 It adds the request.user attribute, representing the currently logged-in user, to every incoming HttpRequest object.

通用中間件

Middleware class: django.middleware.common.CommonMiddleware .

這個中間件爲完美主義者提供了一些便利:

    禁止 ``DISALLOWED_USER_AGENTS`` 列表中所設置的user agent訪問 :一旦提供,這一列表應當由已編譯的正則表達式對象組成,這些對象用於匹配傳入的request請求頭中的user-agent域。 下面這個例子來自某個配置文件片段:

1
2
3
4
5
6
import re
 
DISALLOWED_USER_AGENTS = (
  re.compile(r'^OmniExplorer_Bot'),
  re.compile(r'^Googlebot')
)
  •     請注意 import re ,因爲 DISALLOWED_USER_AGENTS 要求其值爲已編譯的正則表達式(也就是 re.compile() 的返回值)。
  •     依據 ``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上。 will be redirected to the same URL with a leading www..
  •     這兩個選項都是爲了規範化URL。 其後的哲學是每個URL都應且只應當存在於一處。 技術上來說,URL example.com/bar 與 example.com/bar/ 及 www.example.com/bar/ 都互不相同。
  •     依據 ``USE_ETAGS`` 的設置處理Etag : ETags 是HTTP級別上按條件緩存頁面的優化機制。 如果 USE_ETAGS 爲 True ,Django針對每個請求以MD5算法處理頁面內容,從而得到Etag, 在此基礎上,Django將在適當情形下處理並返回 Not Modified 迴應(譯註:
  •     請注意,還有一個條件化的 GET 中間件, 處理Etags並幹得更多,下面馬上就會提及。

壓縮中間件

中間件類 django.middleware.gzip.GZipMiddleware .

這個中間件自動爲能處理gzip壓縮(包括所有的現代瀏覽器)的瀏覽器自動壓縮返回]內容。 這將極大地減少Web服務器所耗用的帶寬。 代價是壓縮頁面需要一些額外的處理時間。

相對於帶寬,人們一般更青睞於速度,但是如果你的情形正好相反,儘可啓用這個中間件。
條件化的GET中間件

Middleware class: django.middleware.http.ConditionalGetMiddleware .

這個中間件對條件化 GET 操作提供支持。 如果response頭中包括 Last-Modified 或 ETag 域,並且request頭中包含 If-None-Match 或 If-Modified-Since 域,且兩者一致,則該response將被response 304(Not modified)取代。 對 ETag 的支持依賴於 USE_ETAGS 配置及事先在response頭中設置 ETag 域。稍前所討論的通用中間件可用於設置response中的 ETag 域。 As discussed above, the ETag header is set by the Common middleware.

此外,它也將刪除處理 HEAD request時所生成的response中的任何內容,並在所有request的response頭中設置 Date 和 Content-Length 域。
反向代理支持 (X-Forwarded-For中間件)

Middleware class: django.middleware.http.SetRemoteAddrFromForwardedFor .

這是我們在 什麼是中間件 這一節中所舉的例子。 在 request.META['HTTP_X_FORWARDED_FOR'] 存在的前提下,它根據其值來設置 request.META['REMOTE_ADDR'] 。在站點位於某個反向代理之後的、每個request的 REMOTE_ADDR 都被指向 127.0.0.1 的情形下,這一功能將非常有用。 It sets request.META['REMOTE_ADDR'] based on request.META['HTTP_X_FORWARDED_FOR'] , if the latter is set. This is useful if you're sitting behind a reverse proxy that causes each request's REMOTE_ADDR to be set to 127.0.0.1 .

紅色警告!

這個middleware並 不 驗證 HTTP_X_FORWARDED_FOR 的合法性。

如果站點並不位於自動設置 HTTP_X_FORWARDED_FOR 的反向代理之後,請不要使用這個中間件。 否則,因爲任何人都能夠僞造 HTTP_X_FORWARDED_FOR 值,而 REMOTE_ADDR 又是依據 HTTP_X_FORWARDED_FOR 來設置,這就意味着任何人都能夠僞造IP地址。

只有當能夠絕對信任 HTTP_X_FORWARDED_FOR 值得時候才能夠使用這個中間件。
會話支持中間件

Middleware class: django.contrib.sessions.middleware.SessionMiddleware .

這個中間件激活會話支持功能.

Middleware classes: django.middleware.cache.UpdateCacheMiddleware and django.middleware.cache.FetchFromCacheMiddleware .

這些中間件互相配合以緩存每個基於Django的頁面。
事務處理中間件

Middleware class: django.middleware.transaction.TransactionMiddleware .

這個中間件將數據庫的 COMMIT 或 ROLLBACK 綁定到request/response處理階段。 如果view函數成功執行,則發出 COMMIT 指令。 如果view函數拋出異常,則發出 ROLLBACK 指令。

這個中間件在棧中的順序非常重要。 其外層的中間件模塊運行在Django缺省的 保存-提交 行爲模式下。 而其內層中間件(在棧中的其後位置出現)將置於與view函數一致的事務機制的控制下。
發佈了16 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章