摘要:一般情優(yōu)下我們以在這里做一些校驗比如戶登錄或者中是否有認證頭之類的驗證這個方法可以有兩種返回值或者,如果返回,那么接下米的處理方法只會執(zhí)行,其他方法將不會被執(zhí)行。它的返回值跟一樣,是或者,其邏輯也一樣。
一個middleware的例子
import time from django.urls import reverse from django.utils.deprecation import MiddlewareMixin class TimeItMiddleware(MiddlewareMixin): def process_request(self, request): return def process_view(self, request, func, *args, **kwargs): if request.path != reverse("index"): return None start = time.time() response = func(request) costed = time.time() - start print("process view: {:.2f}s".format(costed)) return response def process_excepttion(self, request, exception): pass def process_template_response(self, request, response): return response def process_response(self, request, response): return response
middleware中的函數(shù)有:
process_request
process_view
process_tmplate_response
process_response
process_exception
下面分別進行介紹:
process_request:這是請求來到 middleware 中時講入的第一個方法。一般情優(yōu)下,我們以在這里做一些校驗,比如
戶登錄或者 HTTP 中是否有認證頭之類的驗證.這個方法可以有兩種返回值 HttpResnonse 或者None,如果返回 HttpResponse,那么接下米的處理方法只會執(zhí)行 process_response,其他方法將不會被執(zhí)行。這里需要注意的是,如果你的 middleware 是 settings 配置的 MIDDLEWARE 的第一個,那么剩下的 middleware 也不會被執(zhí)行;如果返回 None,那么 Diango會繼續(xù)執(zhí)行其他方法。
這個方法是在 process_request 方法之后執(zhí)行的,參數(shù)如上面代碼所示,其中 func 就是我們將要執(zhí)行的 view 方法。因此,如果要統(tǒng)計一個view的執(zhí)行時間,可以在這里做。它的返回值跟 process_request 一樣,是HttpResponse 或者 None,其邏輯也一樣。如果返回 None,那么 Django 會幫你執(zhí)行 view 函數(shù),從而得到最終的 response。
Process_template_response:執(zhí)行完上面的方法,并且 Django 幫我們執(zhí)行完 view,拿到最終的 response 后,如果使用了模板的 response (這是指通過 return render(request,"index.html",context={})方式返回的 response),就會來到這個方法中。 在這個方法中,我們可以對 response 做一下操作,比如 Content-Type 設(shè)置,或者其他 header 的修改/增加。
process_response:當所有流程都處理完畢后,就來到了這個方法。這個方法的邏輯跟 process_template_response是完全一樣的,只是后者是針對帶有模板的response的處理。
process_exception:上面的處理方法是按順序介紹的,而這個方法不太一樣。只有在發(fā)生異常時,才會進入這個方法。哪個階段發(fā)生的異常呢?
可以簡單理解為在將要調(diào)用的 View 中出現(xiàn)異常(就是在process_view 的 func 函數(shù)中)或者返回的模板 response 在渲染時發(fā)生的異常。但是需要注意的是,如果你在process_view 中手動調(diào)用了 func,就像我們上面做的那樣,就不會觸發(fā) process_exception 了。這個方法接收到異常之
后,可以選擇處理異常,然后返回一個含有異常信息的 HttpResponse,或者直接返回 None 不處理,這種情況下 Django會使用自己的異常模板。
以上節(jié)選自《Django企業(yè)開發(fā)實戰(zhàn)》 胡陽著。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45163.html
摘要:所以,我按照自己的邏輯總結(jié)了一下項目的運行方式和對的基本處理流程。二請求處理流程和其他框架一樣,的處理流程基本類似接受,返回內(nèi)容。在中,中間件組件用字符串表示指向中間件類名的完整路徑。 之前在網(wǎng)上看過一些介紹Django處理請求的流程和Django源碼結(jié)構(gòu)的文章,覺得了解一下這些內(nèi)容對開發(fā)Django項目還是很有幫助的。所以,我按照自己的邏輯總結(jié)了一下Django項目的運行方式和對Re...
摘要:中間件的分類請求期間返回期間如果需要自定義,在中添加對應(yīng)路徑的文件即可自定義方法需求場景在平時開發(fā)調(diào)試中,會遇到這樣那樣的報錯,我們自定義一個簡單的中間件,的自定義步驟很簡單,實現(xiàn)方法即可根據(jù)的和信息,調(diào)用的接口,當報錯時自動搜索相關(guān)的答案 Django中間件MIDDLEWARE的分類: 請求期間: process_request(request) process_view(reque...
摘要:近期的項目,前端的是在上跑的,然后向我們后端的開發(fā)服務(wù)器進行請求。那怎么去掉這個功能呢,我們現(xiàn)在就是要進行跨域請求。這里里面有就直接進入了,沒有下面的檢查了。所以我們只要自己給添加一個這樣的屬性就好了。最直接的方法還是去寫一個啊,哈哈。 近期的項目,前端的js是在localhost上跑的,然后向我們后端的開發(fā)服務(wù)器進行請求。但是突然前端說所有的post請求都報csrf校驗錯誤了,甚是奇...
同源策略:同源策略/SOP(Sameoriginpolicy)是一類承諾,由Netscape公司1995年引進電腦瀏覽器,這是電腦瀏覽器最關(guān)鍵也最基本安全配置,如今全部適用JavaScript瀏覽器都是會使用這種對策。假如缺乏了同源策略,電腦瀏覽器很容易受XSS、CSFR等進攻?! ⊥诰褪侵?quot;協(xié)議書+網(wǎng)站域名+服務(wù)器端口"三個同樣,就算兩種不同的域名跳轉(zhuǎn)相同ip詳細地址,...
摘要:官方緩存系統(tǒng)介紹配置方式及內(nèi)部實現(xiàn)機制中大體分為三種,即針對全站的緩存配置針對視圖的緩存配置針對數(shù)據(jù)的緩存配置。本站采用數(shù)據(jù)庫全站緩存。每個頁面應(yīng)該被緩存的秒數(shù)重啟就可以體驗緩存了。 最近博客增加了許多新功能,訪問速度有所下降,在國內(nèi)某搜索引擎上查找的時候看到了這篇文字,簡單明了,所以轉(zhuǎn)發(fā)過來,雖不是原創(chuàng)但是希望能夠幫助更多的朋友。 Django 官方緩存系統(tǒng)介紹: https://d...
閱讀 2838·2021-11-25 09:43
閱讀 986·2021-10-11 10:57
閱讀 2491·2020-12-03 17:20
閱讀 3735·2019-08-30 14:05
閱讀 2430·2019-08-29 14:00
閱讀 2000·2019-08-29 12:37
閱讀 1672·2019-08-26 11:34
閱讀 3217·2019-08-26 10:27