Django4.0 中間件-升級(jí)Django1.10之前的中間件

2022-03-16 17:59 更新

class django.utils.deprecation.MiddlewareMixin

Django 提供了 ?django.utils.deprecation.MiddlewareMixin? 來方便創(chuàng)建同時(shí)兼容 ?MIDDLEWARE ?和舊的 ?MIDDLEWARE_CLASSES ?的中間件類,并支持同步和異步請(qǐng)求。Django 所包含的所有中間件類都兼容這兩種配置。

?mixin ?提供了一個(gè) ?__init__() ?方法,它需要一個(gè) ?get_response ?參數(shù),并將其存儲(chǔ)在 ?self.get_response? 中。

?__call__()? 方法:

  1. 調(diào)用 ?self.process_request(request)? (如果被定義過)。
  2. 調(diào)用 ?self.get_response(request)? 來從后續(xù)的中間件和視圖得到響應(yīng)。
  3. 調(diào)用 ?self.process_response(request, response)? (如果被定義過)。
  4. 返回響應(yīng)。

如果和 ?MIDDLEWARE_CLASSES ?一起使用,?__call__() ?方法將永遠(yuǎn)不會(huì)被使用;Django 會(huì)直接調(diào)用 ?process_request()? 和 ?process_response() ?。
在大多數(shù)情況下,從這個(gè) ?Mixin ?中繼承就足以使一個(gè)舊式中間件與新系統(tǒng)兼容,并具有足夠的向后兼容性。新的短路語義對(duì)現(xiàn)有中間件無害甚至有益。在少數(shù)情況下,中間件類可能需要一些改變來適應(yīng)新的語義。
?MIDDLEWARE ?和 ?MIDDLEWARE_CLASSES ?在使用上有些行為差異:

  1. ?MIDDLEWARE_CLASSES ?下,每個(gè)中間件將始終調(diào)用它的 ?process_response ?方法,即使早期的中間件通過從其 ?process_response ?方法返回響應(yīng)而短路。?MIDDLEWARE ?下,中間件行為更像洋蔥:響應(yīng)在輸出時(shí)經(jīng)過的層與在輸入時(shí)看到請(qǐng)求的層相同。如果一個(gè)中間件短路,只有那個(gè)中間件和之前的中間件可以看到響應(yīng)。
  2. 在 ?MIDDLEWARE_CLASSES ?下,?process_exception ?應(yīng)用于中間件 ?process_request ?方法引發(fā)的異常。在 ?MIDDLEWARE ?下,?process_exception ?只應(yīng)用于視圖引發(fā)的異常(或者從 ?TemplateResponse ?的 ?render ?方法引發(fā)的異常)。中間件引發(fā)的異常被轉(zhuǎn)換為合適的 HTTP 響應(yīng),然后傳遞到下一個(gè)中間件。
  3. ?MIDDLEWARE_CLASSES ?下,如果 ?process_response ?方法引發(fā)了異常,所有更早之前的中間件的 ?process_response ?方法會(huì)被跳過,并一直返回 ?500 Internal Server Error? 的 HTTP 響應(yīng)(即使引發(fā)的異常是例如 Http404 )。在 ?MIDDLEWARE ?,一個(gè)中間件引發(fā)的異常將立刻被轉(zhuǎn)換為合適的 HTTP 響應(yīng),然后下一個(gè)中間件將看到響應(yīng)。中間件不會(huì)因?yàn)橹虚g件引發(fā)異常而被跳過。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)