Django4.0 中間件-其他中間件鉤子

2022-03-16 17:59 更新

除前面說的基礎(chǔ)請(qǐng)求/響應(yīng)中間件模式外,你可以給基于類的中間件添加三種其他特殊方法:

process_view()

process_view(request, view_func, view_args, view_kwargs)

?request? 是一個(gè) ?HttpRequest ?對(duì)象。?view_func ?是一個(gè) Django 將要使用的 Python 函數(shù)。(這是一個(gè)真實(shí)的函數(shù)對(duì)象,不是函數(shù)的名稱);?view_args ?是一個(gè)用來傳遞給視圖的位置參數(shù)列表,;?view_kwargs ?是一個(gè)用來傳遞給視圖的關(guān)鍵字參數(shù)字典。?view_args ?和 ?view_kwargs ?都不包含第一個(gè)視圖參數(shù) ( ?request ?)。
?process_view()? 只在 Django 調(diào)用視圖前被調(diào)用。
它應(yīng)該返回 ?None ?或 ?HttpResponse ?對(duì)象。如果它返回 ?None ?,Django 將繼續(xù)處理這個(gè)請(qǐng)求,執(zhí)行任何其他的 ?process_view()? ,然后執(zhí)行相應(yīng)的視圖。如果它返回 ?HttpResponse ?對(duì)象,Django 不會(huì)去影響調(diào)用相應(yīng)的視圖;它會(huì)將響應(yīng)中間件應(yīng)用到 ?HttpResponse ?并返回結(jié)果。

注解:在視圖運(yùn)行前或在 ?process_view()? 內(nèi)訪問中間件里的 ?request.POST? 將阻止中間件之后運(yùn)行的任何視圖修改請(qǐng)求的上傳處理程序 (?modify the upload handlers for the request? ),通常應(yīng)該避免這樣。

?CsrfViewMiddleware ?類可以被視為一個(gè)例外,因?yàn)樗峁??csrf_exempt()? 和 ?csrf_protect()? 裝飾器,它們?cè)试S視圖完全控制 ?CSRF ?驗(yàn)證在什么時(shí)候進(jìn)行。

process_exception()

process_exception(request, exception)

?request ?是一個(gè) ?HttpRequest ?對(duì)象。 ?exception ?是一個(gè)由視圖函數(shù)引發(fā)的 ?Exception? 對(duì)象。
當(dāng)視圖引發(fā)異常時(shí),Django 會(huì)調(diào)用 ?process_exception()?。?process_exception()? 應(yīng)該返回 ?None ?或 ?HttpResponse ?對(duì)象。如果它返回一個(gè) ?HttpResponse ?對(duì)象,模板響應(yīng)和響應(yīng)中間件將被應(yīng)用且會(huì)將結(jié)果響應(yīng)返回瀏覽器。否則,就會(huì)開始默認(rèn)異常處理( ?default exception handling? )。
再次,中間件在響應(yīng)階段會(huì)按照相反的順序運(yùn)行,其中包括 ?process_exception ?。如果異常中間件返回一個(gè)響應(yīng),那么中間件之上的中間件類的 ?process_exception ?方法根本不會(huì)被調(diào)用。

process_template_response()

process_template_response(request, response)

?request ?是一個(gè) ?HttpRequest ?對(duì)象。?response ?是 ?TemplateResponse ?對(duì)象(或者等效對(duì)象),它通過 Django 視圖或中間件返回。
?process_template_response()? 在視圖被完全執(zhí)行后調(diào)用,如果響應(yīng)實(shí)例有 ?render()? 方法,表明它是一個(gè) ?TemplateResponse ?或等效對(duì)象。
它必須返回一個(gè)實(shí)現(xiàn)了 ?render ?方法的響應(yīng)對(duì)象。它可以通過改變?response.template_name?和 ?response.context_data? 來改變給定的 ?response ?,或者它可以創(chuàng)建和返回全新的 ?TemplateResponse ?或等效對(duì)象。
你不需要顯式地渲染響應(yīng)——一旦所有模板中間件被調(diào)用,響應(yīng)會(huì)被自動(dòng)渲染。
中間件會(huì)在響應(yīng)階段按照相反的順序運(yùn)行,其中包括 ?process_template_response()? 。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)