Django學習之七:Django 中間件

来源:https://www.cnblogs.com/ZJiQi/archive/2018/09/04/9589177.html
-Advertisement-
Play Games

Django 中間件 [TOC] Django中間件可看作是包裹在django處理機制的外層,Httprequest和Httpresponse都要經中間件處理,從而起到全局鉤子的作用,可以達到一些目的:如過濾請求,預處理請求,響應修改等。 我理解,很多基於會話的應用系統,都可以設計中間件環節。如數據 ...


目錄

Django 中間件

Django中間件可看作是包裹在django處理機制的外層,Httprequest和Httpresponse都要經中間件處理,從而起到全局鉤子的作用,可以達到一些目的:如過濾請求,預處理請求,響應修改等。

我理解,很多基於會話的應用系統,都可以設計中間件環節。如資料庫系統。中間件可以起到全局鉤子的作用。django的中間件的設計就是一種遞歸順序調用,利用httprequest作為遞歸調用的參數,httpresponse作為遞歸調用的return返回。

Django提供了內置的一些中間件。思考:request對象中的user屬性中的用戶對象是怎麼來的,就是會話中間件和認證中間件處理session_id,獲取用戶對象,從而將用戶對象放入request對象中,再交與view中進行處理。request對象在中間件開發中起到了載體的作用,非常重要。

中間件框架,設計上就是嵌套調用,初始化一個中間件函數或者中間件對象;中間件函數的初始化通過一個外層的中間件工廠函數;中間件對象的初始化當然是**中間件類的__init__()函數**嘍。這兩種的初始化,工廠函數和類__init__()都需要傳入一個get_response函數,這個get_response的傳入是django引擎會帶入的,一般是初始化後的中間件列表的下一個中間件函數,或者對象,相當於就是嵌套調用遞歸下去,當最後的view函數處理完後再一層一層返回response,再進行response返回的中間件過程處理。原理設計就是嵌套遞歸返回模型(我自己起的名字,知道想表達的意思就好):

自定義中間件 - - - 大體兩種方式

中間件工廠函數方式

重點

def simple_middleware(get_response):
    # One-time configuration and initialization.

    def middleware(request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        # 註意這裡的代碼是view之前還是之後,兩種情景的分隔就是下麵這個函數調用,這是基於遞歸調用設計的關鍵之處。
        
        response = get_response(request)
        
        # 下麵的就是view處理過後,可以處理httpresponse對象。
        # Code to be executed for each request/response after
        # the view is called.

        return response

    return middleware  # 這是django初始化時調用中間件工廠函數,返回中間件函數。

基於中間件類方式

要點

  • 導入父類from django.utils.deprecation import MiddlewareMixin
  • 自定義自己的中間件類繼承上條導入的父類
  • 定義要中間件處理的django生命周期的環節處理函數:
    • process_request(self,request)
    • process_view(self, request, callback_view, callback_args, callback_kwargss)
    • process_template_response(request, response)
    • process_response(self, request, response)
    • process_exception(self, request, response, except)
  • 激活中間件,在settings中的MIDDLEWARE列表中放置中間件類或者中間件工廠函數。註意放置在列表中的位置,這個很重要,因為中間可能存在依賴關係(request和response就像就中間件之間傳遞個的信息的載體;如auth中間件就要放在session中間件後面)。列表中就中間件的full python path(python全路徑)字元串.
  • 至於中間件程式模塊文件,可以放在python path的任何地方,建議和組件相關放一起。
# 基於類的方式一
from django.utils.deprecation import MiddlewareMixin

class MyMiddle01(MiddlewareMixin):
    # 1. 定義中間件功能,具體處理整個django請求和響應的生命周期的哪一環節。
    # 2. 主要有request請求到達環節;路由Urlconf後View處理前的view預處理環節;View處理過程中拋出異常的對該異常響應的處理環節(異常情況);正常情況下view返回的response環節;還有一個模版環節(不常用);
    def process_request(self, request):
        pass
    
    def process_view(self, request, callback_view, callback_args, callback_kwargs):
        callback_view(request, *callback_args, *callback_kwargs)
        pass

    def process_template_response(request, response):
        pass

    def process_response(self, request, response):
        return response

    def process_exception(request, except):
        pass
    
    
# 基於類的方式二

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response
    
    def process_view():
        pass

    def process_exception():
        pass

    def process_template_response():
        pass    

將中間件移除

  1. 方式一:將中間件從配置中移除。
  2. 方式二:中間件初始化是拋出MiddlewareNotUsed異常即可,在初始化中間件函數或者對象時。

實例

許可權鑒別中間件

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
import re


class RbacPermissionMiddleware(MiddlewareMixin):
    """
    請求訪問許可權中間件
    """

    def process_request(self, request):
        """
        許可權check
        :param request:
        :return:
        """
        req_path = request.path_info
        print('用戶請求uri', req_path)
        # 定義白名單url
        white_list = ['/login/', '/register/']
        for url in white_list:
            url = '^%s$' % url
            if re.match(url, req_path):
                return None  # 如果請求許可權是白名單中,那麼中間件返回一個None,就會進行下一個中間件處理流。

        # 從session中獲取許可權url列表
        p_list = request.session.get('permissions')
        if not p_list:
            return HttpResponse('未獲取用戶許可權信息,請登錄!')

        p_flag = False
        for p_url in p_list:
            p_url = '^%s$' % p_url
            if re.match(p_url, req_path):
                p_flag = True
                break
        if not p_flag:
            return HttpResponse('沒有訪問許可權!')

總結

  1. 中間件函數就類似一個view函數,參數獲取request,return返回response。只不過需要遞歸調用下一個中間件函數。(下一個中間件函數,是中間件工廠函數通過閉包傳遞給中間件函數的)
  2. 自定義中間件有多種形式:工廠函數,中間件類。
  3. 中間件註冊到django項目時,有順序性。
  4. 中間件會影響全局性能,畢竟所有請求都會進出都需要通過中間件。
  5. 額外的request_process()等都是只能創建在基於類的中間件,因為這些都是通過類的反射方式調用的。 或者異常觸發,或者urlconf觸發。。。

  6. 中間件函數還提供內部額外的改變請求和響應的路由路徑。如:
    視圖函數正常執行時:

視圖函數拋出異常時:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一: 什麼是分散式系統 《分散式系統原理與範型》一書中這樣定義分散式系統:“ 分散式系統是若幹獨立電腦的集合,這些電腦對於用戶來說就像是單個相關係統”。 歸納來說就是 : 硬體獨立,軟體統一 。 什麼是硬體獨立 ? 所謂硬體獨立,是指電腦機器本身是獨立的,一個大型的分散式系統,會由若幹台電腦 ...
  • 第一步:準備工作 1、下載並集成公司自定義maven maven包見QQ群文件 2、克隆Git源碼到本地eclipse: xx 3、構建項目 一鍵初始化parent:run as maven install 註意:構建報錯缺少依賴jar ojdbc14-10.2.0.5.0.jar 到 C:\Use ...
  • c/c++ 模板與STL小例子系列 traits 對這個概念,還是處於懵逼的狀態,初步體會就是,為瞭解決類型之間的轉換問題。 從一個類型為A的指針,轉化到類型為B的指針,中間需要用void 來作為中介。traits好像可以解決這種問題。 下麵弄了3個小例子,可以初步感受一下。 例子1: ...
  • 版權聲明:本文為博主原創文章,未經允許不得轉載。 安裝模塊 如果使用的是Linux系統,並且安裝了pip,可以直接使用pip安裝xlrd, xlwt: 也可以從官網下載源代碼安裝: https://pypi.org/project/xlwt/1.1.2/ https://pypi.org/proje ...
  • 版權聲明:本文為博主原創文章,未經允許不得轉載。 ...
  • 遍歷列表 # 直接遍歷list: # 通過索引獲取 # 基於enumerate()遍歷 # 基於iter()遍歷 遍歷dict # 通過key遍歷 # 直接遍歷,本質是先轉換成 (key,value)的list # iteritems() 返回值是 items的迭代器 ...
  • 使用靜態類型的編程語言實在編譯時執行類型檢查,而不是在運行時執行類型檢查。C++屬於靜態類型語言。 面向對象四大特性:封裝、繼承、抽象、多態。 標準C++三個重要部分組成:核心語言、C++標準庫、標準模板庫(STL)。 ANSI標準,確保C++的便攜性,我理解為跨平臺性。 C++主要用於與硬體設備相 ...
  • #如何修改文件,我們知道文件因為在磁碟上已經有儲存了,後面要更新或修改,只能在在原來文件後面追加使用f=open("wenjian_name","r+",encoding="utf-8“)這裡的“r+"指的是讀 寫,也可以替換成”a+“append+但是無法對原文件中間及之前的內容進行改變那麼怎麼修 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...