中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django如何自己創建一個中間件

發布時間:2020-10-13 07:00:56 來源:腳本之家 閱讀:133 作者:苦瓜爆炒牛肉 欄目:開發技術

中間件是什么?

中間件是類似flask函數中鉤子函數的東西。可以在請求視圖函數前,或者視圖函數響應后處理某些事情。中間件對全部視圖都有效!

django如何自己創建一個中間件

中間件一般會有兩個方法,process_request和process_response。分別用來處理請求到達視圖函數前,到達視圖函數后的事情。

編寫一個自定義的中間件

我們可以根據業務需要自己編寫一個中間件。在編寫中間件前,你需要讀一下django.utils.deprecation.MiddlewareMixin的源碼。

class MiddlewareMixin(object):
  def __init__(self, get_response=None):
    self.get_response = get_response
    super(MiddlewareMixin, self).__init__()

  def __call__(self, request):
    response = None
    if hasattr(self, 'process_request'):
      response = self.process_request(request)
    if not response:
      response = self.get_response(request)
    if hasattr(self, 'process_response'):
      response = self.process_response(request, response)
    return response

方法名 作用 返回值 備注
__init__(self, get_response=None) 服務器啟動(重啟)時執行一次 --
process_request(self, request) 在視圖執行之前調用
  • 返回 `None`: 會執行視圖
  • 返回 `HttpResponse`: 不會再執行視圖
--
process_response(self, request, response) 在視圖執行完之后調用 必須返回HttpResponse對象 --

編寫自定義的中間件:

class My_middleware(MiddlewareMixin):
  def __init__(self,get_response=None):
    super().__init__(get_response)

  def process_request(self,request):
    """
    視圖函數前執行的,一旦這里有return將到達不了視圖函數
    request是瀏覽器發過來的請求
    """
    print("視圖函數執行前")

  def process_response(self,request,response):
    """
    視圖函數后執行的
    request是瀏覽器發過來的請求
    response是視圖函數返回的響應
    """
    print("視圖函數執行后")

    # 因為你拿了視圖函數的response,就算處理的業務與response無關也要返回response
    return response

中間件的注冊

MIDDLEWARE = [
  ...
  'middlewares.My_middleware'  # 寫上自己的路徑
]

多個中間件的執行順序

django如何自己創建一個中間件

!!!如果你定義了多個中間件,記得注意一下中間件擺在setting.py文件的位置:

  • 注冊中間件設置是由上到下執行的,所以上面的中間件會先被注冊
  • 對于視圖函數執行前的process_request,先注冊的中間件會先執行
  • 對于視圖函數執行后的process_response,后注冊的中間件會先執行

例如:

先注冊中間件1,后注冊中間件2。

輸出結果是:

before 視圖(中間件1)
before 視圖 2(中間件2)
==index==
after 視圖 2(中間件2)
after 視圖(中間件1)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜章县| 嘉善县| 定安县| 封丘县| 石泉县| 广宗县| 旌德县| 莱阳市| 阿拉善右旗| 晋中市| 全南县| 西宁市| 凤庆县| 集贤县| 红河县| 阿鲁科尔沁旗| 巨野县| 瑞安市| 营山县| 娄烦县| 桑植县| 屯昌县| 专栏| 吴江市| 福清市| 锡林浩特市| 余姚市| 屯留县| 宁蒗| 江达县| 旺苍县| 普安县| 临湘市| 扬中市| 抚顺市| 南皮县| 天峻县| 鄂州市| 泰宁县| 武鸣县| 吉林市|