詳解Python的Django框架中的中間件
什么是中間件
我們從一個簡單的例子開始。
高流量的站點通常需要將Django部署在負載平衡proxy之后。 這種方式將帶來一些復(fù)雜性,其一就是每個request中的遠程IP地址(request.META["REMOTE_IP"])將指向該負載平衡proxy,而不是發(fā)起這個request的實際IP。 負載平衡proxy處理這個問題的方法在特殊的 X-Forwarded-For 中設(shè)置實際發(fā)起請求的IP。
因此,需要一個小小的中間件來確保運行在proxy之后的站點也能夠在 request.META["REMOTE_ADDR"] 中得到正確的IP地址:
class SetRemoteAddrFromForwardedFor(object): def process_request(self, request): try: real_ip = request.META['HTTP_X_FORWARDED_FOR'] except KeyError: pass else: # HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs. # Take just the first one. real_ip = real_ip.split(",")[0] request.META['REMOTE_ADDR'] = real_ip
(Note: Although the HTTP header is called X-Forwarded-For , Django makes it available as request.META['HTTP_X_FORWARDED_FOR'] . With the exception of content-length and content-type , any HTTP headers in the request are converted to request.META keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name.)
一旦安裝了該中間件(參見下一節(jié)),每個request中的 X-Forwarded-For 值都會被自動插入到 request.META['REMOTE_ADDR'] 中。這樣,Django應(yīng)用就不需要關(guān)心自己是否位于負載平衡proxy之后;簡單讀取 request.META['REMOTE_ADDR'] 的方式在是否有proxy的情形下都將正常工作。
實際上,為針對這個非常常見的情形,Django已將該中間件內(nèi)置。 它位于 django.middleware.http 中, 下一節(jié)將給出這個中間件相關(guān)的更多細節(jié)。
安裝中間件
要啟用一個中間件,只需將其添加到配置模塊的 MIDDLEWARE_CLASSES 元組中。 在 MIDDLEWARE_CLASSES 中,中間件組件用字符串表示: 指向中間件類名的完整Python路徑。 例如,下面是 django-admin.py startproject 創(chuàng)建的缺省 MIDDLEWARE_CLASSES :
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', )
Django項目的安裝并不強制要求任何中間件,如果你愿意, MIDDLEWARE_CLASSES 可以為空。
這里中間件出現(xiàn)的順序非常重要。 在request和view的處理階段,Django按照 MIDDLEWARE_CLASSES 中出現(xiàn)的順序來應(yīng)用中間件,而在response和異常處理階段,Django則按逆序來調(diào)用它們。 也就是說,Django將 MIDDLEWARE_CLASSES 視為view函數(shù)外層的順序包裝子: 在request階段按順序從上到下穿過,而在response則反過來。
相關(guān)文章
yolov5訓(xùn)練時參數(shù)workers與batch-size的深入理解
最近再學(xué)習(xí)YOLOv3與YOLOv5訓(xùn)練數(shù)據(jù)集的具體步驟,幾經(jīng)波折終于實現(xiàn)了很好的效果,這篇文章主要給大家介紹了關(guān)于yolov5訓(xùn)練時參數(shù)workers與batch-size的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-03-03python連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的實現(xiàn)
這篇文章主要介紹了python連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09django通過ajax發(fā)起請求返回JSON格式數(shù)據(jù)的方法
這篇文章主要介紹了django通過ajax發(fā)起請求返回JSON格式數(shù)據(jù)的方法,較為詳細的分析了django處理ajax請求的技巧,需要的朋友可以參考下2015-06-06詳解Python 數(shù)據(jù)庫 (sqlite3)應(yīng)用
本篇文章主要介紹了Python標(biāo)準(zhǔn)庫14 數(shù)據(jù)庫 (sqlite3),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。2016-12-12使用Python腳本來獲取Cisco設(shè)備信息的示例
這篇文章主要介紹了編寫Python腳本來獲取Python腳本來獲取Cisco設(shè)備信息的教程,文中的示例是獲取一臺思科交換機的腳本,需要的朋友可以參考下2015-05-05