詳解Python的Django框架中的中間件
什么是中間件
我們從一個(gè)簡(jiǎn)單的例子開(kāi)始。
高流量的站點(diǎn)通常需要將Django部署在負(fù)載平衡proxy之后。 這種方式將帶來(lái)一些復(fù)雜性,其一就是每個(gè)request中的遠(yuǎn)程IP地址(request.META["REMOTE_IP"])將指向該負(fù)載平衡proxy,而不是發(fā)起這個(gè)request的實(shí)際IP。 負(fù)載平衡proxy處理這個(gè)問(wèn)題的方法在特殊的 X-Forwarded-For 中設(shè)置實(shí)際發(fā)起請(qǐng)求的IP。
因此,需要一個(gè)小小的中間件來(lái)確保運(yùn)行在proxy之后的站點(diǎn)也能夠在 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àn)下一節(jié)),每個(gè)request中的 X-Forwarded-For 值都會(huì)被自動(dòng)插入到 request.META['REMOTE_ADDR'] 中。這樣,Django應(yīng)用就不需要關(guān)心自己是否位于負(fù)載平衡proxy之后;簡(jiǎn)單讀取 request.META['REMOTE_ADDR'] 的方式在是否有proxy的情形下都將正常工作。
實(shí)際上,為針對(duì)這個(gè)非常常見(jiàn)的情形,Django已將該中間件內(nèi)置。 它位于 django.middleware.http 中, 下一節(jié)將給出這個(gè)中間件相關(guān)的更多細(xì)節(jié)。
安裝中間件
要啟用一個(gè)中間件,只需將其添加到配置模塊的 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項(xiàng)目的安裝并不強(qiáng)制要求任何中間件,如果你愿意, MIDDLEWARE_CLASSES 可以為空。
這里中間件出現(xiàn)的順序非常重要。 在request和view的處理階段,Django按照 MIDDLEWARE_CLASSES 中出現(xiàn)的順序來(lái)應(yīng)用中間件,而在response和異常處理階段,Django則按逆序來(lái)調(diào)用它們。 也就是說(shuō),Django將 MIDDLEWARE_CLASSES 視為view函數(shù)外層的順序包裝子: 在request階段按順序從上到下穿過(guò),而在response則反過(guò)來(lái)。
相關(guān)文章
PyQt5+requests實(shí)現(xiàn)車票查詢工具
這篇文章主要為大家詳細(xì)介紹了PyQt5+requests實(shí)現(xiàn)車票查詢工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01yolov5訓(xùn)練時(shí)參數(shù)workers與batch-size的深入理解
最近再學(xué)習(xí)YOLOv3與YOLOv5訓(xùn)練數(shù)據(jù)集的具體步驟,幾經(jīng)波折終于實(shí)現(xiàn)了很好的效果,這篇文章主要給大家介紹了關(guān)于yolov5訓(xùn)練時(shí)參數(shù)workers與batch-size的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03python連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了python連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09django通過(guò)ajax發(fā)起請(qǐng)求返回JSON格式數(shù)據(jù)的方法
這篇文章主要介紹了django通過(guò)ajax發(fā)起請(qǐng)求返回JSON格式數(shù)據(jù)的方法,較為詳細(xì)的分析了django處理ajax請(qǐng)求的技巧,需要的朋友可以參考下2015-06-06詳解Python 數(shù)據(jù)庫(kù) (sqlite3)應(yīng)用
本篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)14 數(shù)據(jù)庫(kù) (sqlite3),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。2016-12-12使用Python腳本來(lái)獲取Cisco設(shè)備信息的示例
這篇文章主要介紹了編寫Python腳本來(lái)獲取Python腳本來(lái)獲取Cisco設(shè)備信息的教程,文中的示例是獲取一臺(tái)思科交換機(jī)的腳本,需要的朋友可以參考下2015-05-05Python自動(dòng)化測(cè)試PO模型封裝過(guò)程詳解
在 PO 模式中抽離封裝集成一個(gè)BasePage 類,該基類應(yīng)該擁有一個(gè)只實(shí)現(xiàn) webdriver 實(shí)例的屬性,通常情況下PO 模型可以大大提高測(cè)試用例的維護(hù)效率2021-06-06