Django框架之中間件

目錄

一、引入

二、Django中間件介紹

【1】什么是Django中間件

【2】Django中間件的作用

【3】示例

三、Django請求生命周期流程圖

四、Django中間件是Django的門戶

五、Django中間件詳解

六、中間件必須要掌握的兩個方法

(1)? process_request

(2)? process_response

七、自定義中間件

【1】process_request

【2】process_response

【3】小結


一、引入

  • Django自帶七個中間件,每個中間件都有各自對應的功能
  • 并且Django支持用戶自定義中間件
  • 在使用Django框架開發項目的時候,只要是涉及到全局相關的功能都可以使用中間件更加方便的完成
    • 比如全局身份校驗
    • 全局用戶權限校驗
    • 全局訪問頻率的校驗
    • ...

二、Django中間件介紹

【1】什么是Django中間件

  • Django中間件是一個輕量級、可重用的組件,用于處理Django請求和響應的過程。
  • 它提供了對請求和響應進行全局處理的機制,可以在請求達到視圖之前進行預處理或在響應返回給客戶端之前進行后處理。
  • 中間件是按照順序依次執行的,每個中間件都可以對請求和響應進行修改、補充或處理。
  • 在Django的settings.py配置文件中,通過MIDDLEWARE設置來定義中間件的順序。

【2】Django中間件的作用

  • 認證和授權:
    • 中間件可以在請求到達視圖之前進行用戶認證和權限驗證,確保只有經過授權的用戶才能訪問敏感資源。
  • 請求和響應處理:
    • 中間件可以在請求到達視圖之前對請求進行預處理
      • 例如添加請求頭信息、檢查請求參數的合法性等操作。
    • 同時,在視圖函數返回響應給客戶端之前,中間件還可以對響應進行后處理
      • 例如添加額外的響應頭、包裝響應數據等操作。
  • 異常處理:
    • 中間件還可以捕獲視圖函數中可能拋出的異常,并做相應的處理
      • 例如記錄異常日志、返回自定義錯誤信息等。
  • 性能優化:
    • 通過中間件,可以對請求進行性能監測、緩存處理、壓縮響應等操作,提升網站的整體性能。

【3】示例

class MyMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 在視圖函數調用之前的預處理邏輯# ...response = self.get_response(request)# 在響應返回給客戶端之前的后處理邏輯# ...return response

三、Django請求生命周期流程圖

  • 當客戶端發送一個請求到Django應用程序時,Django會按照一定的生命周期流程處理該請求。
    • 客戶端發出HTTP請求。
    • 請求被Web服務器接收并傳遞給Django應用程序。
    • Django中的WSGI中間件開始處理請求,并可進行一些預處理操作。
    • 中間件將請求傳遞給URL分發器(URL Dispatcher)。
    • URL分發器根據URL模式將請求路由到相應的視圖函數或處理器(View/Handler)。
    • 視圖函數或處理器執行相應的業務邏輯,可能會與數據庫等外部資源交互。
    • 視圖函數或處理器返回一個HTTP響應對象。
    • 響應對象經過中間件,可以在此進行后處理操作。
    • 響應被發送給Web服務器。
    • Web服務器將響應發送回客戶端。

四、Django中間件是Django的門戶

  • 請求發來的時候需要先經過中間件才能到達真正的Django后端
  • 響應返回的時候,最后也需要進過中間件返回發送出去

五、Django中間件詳解

(1)? SecurityMiddleware

  • django.middleware.security.SecurityMiddleware:
    • 安全中間件負責處理與網站安全相關的任務
    • 例如設置HTTP頭部,防止跨站腳本攻擊(XSS),點擊劫持等。
    • 它可以通過配置自定義安全策略來確保網站的安全性。

(2)? SessionMiddleware

  • django.contrib.sessions.middleware.SessionMiddleware:
    • 會話中間件負責處理用戶會話的創建之間存儲和檢索用戶數據。
    • 它基于瀏覽器提供的Cookie或URL傳遞的會話ID進行會話跟蹤,并將會話數據存儲在后端數據庫或緩存中,以實現用戶狀態的跨請求保持。

(3)? CommonMiddleware

  • django.middleware.common.CommonMiddleware:
    • 通用中間件提供了一些常見而關鍵的HTTP請求處理功能
    • 例如,根據請求的HTTP頭信息設置語言、時區等。
    • 此外,它還處理靜態文件的serving,包括收集靜態文件,為其生成URL,并在開發模式下提供靜態文件的serving。

(4)? CsrfViewMiddleware

  • django.middleware.csrf.CsrfViewMiddleware:
    • CSRF(Cross-Site Request Forgery)中間件用于防止跨站請求偽造攻擊。
    • 它在每個POST請求中驗證一個CSRF標記,確保請求是通過合法的表單提交得到的,從而保護用戶免受惡意站點的攻擊。

(5)? AuthenticationMiddleware

  • django.contrib.auth.middleware.AuthenticationMiddleware:
    • 認證中間件負責處理用戶身份認證相關的任務
    • 例如將認證信息關聯到請求對象上,為每個請求提供一個user對象,以便在請求處理過程中輕松地獲取和使用用戶身份信息。

(6)? MessageMiddleware

  • django.contrib.messages.middleware.MessageMiddleware:
    • 消息中間件用于在請求處理過程中存儲和傳遞臨時的、一次性的用戶消息。
    • 它允許在HTTP重定向之間跨請求傳遞消息,例如成功或錯誤提示,以改善用戶體驗。

(7)? XFrameOptionsMiddleware

  • django.middleware.clickjacking.XFrameOptionsMiddleware:
    • 點擊劫持中間件用于防止頁面被嵌入到其他網站中,從而提供一定的點擊劫持保護。
    • 它通過設置X-Frame-Options HTTP頭部來限制頁面的顯示方式,從而防止惡意網頁通過iframe等方式嵌入當前網頁。

六、中間件必須要掌握的兩個方法

(1)? process_request

(1)執行順序

  • 請求來的時候需要經過每一個中間件的 process_request 方法
  • 結果的順序是按照配置文件中注冊的中間件從上往下的順序執行的

(2)沒有定義process_request

  • 如果沒有定義這個方法,就跳過這個中間件

(3)定義了返回值

  • 如果在自定義中間件中定義了返回值(三板斧),那么請求將不再繼續執行,而是直接原路返回(校驗失敗不允許訪問)

(4)總結

  • process_request 方法就是用來 做全局相關的所有限制功能
  • 該方法在每個請求到達視圖之前被調用,可以對請求進行預處理。
    • 例如,進行身份驗證、訪問控制或請求日志記錄等操作。
  • 它接收一個HttpRequest對象作為參數,并且沒有返回值

示例:

class AuthenticationMiddleware:def process_request(self, request):# 在這里進行身份驗證操作if not request.user.is_authenticated:# 如果用戶未經身份驗證,則返回HttpResponse或重定向到登錄頁面

(2)? process_response

  • 響應被返回的時候需要結束每一個中間件里面的 process_response 方法
    • 該方法有兩個額外的參數
      • request
      • response
  • 該方法必須返回 HttpResponse 對象
    • 默認是response
    • 支持自定義
  • 順序是按照配置文件中注冊過的中間件從下往上依次經過
    • 如果沒有定義,則跳過,校驗下一個
  • 該方法在每個請求結束并且響應返回到客戶端之前被調用。
    • 可以在此處對響應進行處理
    • 例如添加額外的頭信息、修改響應內容等。
  • 它接收一個HttpRequest對象和HttpResponse對象作為參數,并且必須返回一個HttpResponse對象。

示例:

class CustomResponseMiddleware:def process_response(self, request, response):# 在這里對響應進行處理response['X-Custom-Header'] = 'Custom Value'return response

七、自定義中間件

【1】process_request

  • 路由層
from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/',views.index),
]
  • 視圖層?
def index(request):print("這是視圖函數index")return HttpResponse("index 的返回值")
  • 配置文件?
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# 注冊自己的中間件(在應用下創建路徑會有提示,但是如果在項目下創建就沒有提示,需要自己根據路徑書寫)'app01.mymiddle.my_middle.MyMiddle',# 誰先注冊就先執行誰'app01.mymiddle.my_middle.MyMiddle2',
]
  • 自定義中間件?
# 引入父類
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print("這是第一個自定義中間件中的 process_request 方法")class MyMiddle2(MiddlewareMixin):def process_request(self, request):print("這是第二個自定義中間件中的 process_request 方法")

【2】process_response

# 引入父類
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print("這是第一個自定義中間件中的 process_request 方法")def process_response(self, request, response):''':param request: :param response: 就是Django返回給瀏覽器的內容:return: '''print("這是第一個自定義中間件中的 process_response 方法")# 必須返回 responserreturn response

【3】小結

  • 如果在第一個 process_request 方法就已經返回了 HttpResponse 對象,那么響應被返回的時候是經過所有的中間件里面的 process_response 方法還是會發生其他?
    • 會直接走同級別的 process_response 方法 ,然后直接返回
  • flask框架的中間件也有一個類似的方法
    • 但是flask返回數據就必須經過所有中間件里面的 process_response 方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165630.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165630.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis集群環境各節點無法互相發現與Hash槽分配異常 CLUSTERDOWN Hash slot not served的解決方式

原創/朱季謙 在搭建Redis5.x版本的集群環境曾出現各節點無法互相發現與Hash槽分配異常 CLUSTERDOWN Hash slot not served的情況,故而把解決方式記錄下來。 在以下三臺虛擬機機器搭建Redis集群—— 192.168.200.160192.168.200.161192.168.200.162啟動三臺Redis集…

芯知識 | MP3語音芯片IC的優勢特征及其在現代科技應用中的價值

隨著科技的飛速發展,MP3語音芯片作為一種高度集成的音頻處理解決方案,在現代電子產品中發揮著越來越重要的作用。本文將分析MP3語音芯片的優勢特征,并探討其在各個領域的應用價值。 一、MP3語音芯片的優勢特征 MP3語音芯片具有多種顯著的優…

CC++輸入輸出流介紹

介紹 C中的輸入輸出流主要包括標準輸入輸出流、文件輸入輸出流和內存數據流。 標準輸入輸出流可以通過使用cin和cout進行數據的讀取和輸出文件輸入輸出流可以通過使用ifstream和ofstream對文件進行讀寫操作內存數據流可以通過使用stringstream對字符串進行讀寫操作 應用舉例…

服務器租用收費標準是什么?

服務器在企業轉型中或者是互聯網企業中起著舉足輕重的作用,服務器有強大的存儲能力和計算能力,能夠幫助企業存儲大量信息,完成日常工作,服務器租用就是通過正規的IDC服務器商家那里獲取服務器資源,根據企業自身需求選擇…

Python爬蟲-獲取汽車之家新車優惠價

前言 本文是該專欄的第10篇,后面會持續分享python爬蟲案例干貨,記得關注。 本文以汽車之家新車優惠價為例,獲取各車型的優惠價,示例圖如下: 地址:aHR0cHM6Ly9idXkuYXV0b2hvbWUuY29tLmNuLzAvMC8wLzQyMDAwMC80MjAxMDAvMC0wLTAtMS5odG1sI3B2YXJlYWlkPTIxMTMxOTU= 需求:獲…

OpenStack云計算平臺

目錄 一、OpenStack 1、簡介 2、硬件需求 3、網絡 二、環境搭建 1、安全 2、主機網絡 3、網絡時間協議(NTP) 4、OpenStack包 5、SQL數據庫 6、消息隊列 7、Memcached 一、OpenStack 1、簡介 官網:https://docs.openstack.org/2023.2/ OpenStack系統由…

Zynq-7000系列FPGA使用 Video Processing Subsystem 實現圖像縮放,提供工程源碼和技術支持

目錄 1、前言免責聲明 2、相關方案推薦FPGA圖像處理方案FPGA圖像縮放方案自己寫的HLS圖像縮放方案 3、設計思路詳解Video Processing Subsystem 介紹 4、工程代碼詳解PL 端 FPGA 邏輯設計PS 端 SDK 軟件設計 5、工程移植說明vivado版本不一致處理FPGA型號不一致處理其他注意事項…

給sprite上增加刷光動效

游戲引擎 —— cocos creator 3.52 此動效給動態修改尺寸的圖片增加一層刷光的效果,直接貼代碼 CCEffect %{techniques:- passes:- vert: sprite-vs:vertfrag: sprite-fs:fragdepthStencilState:depthTest: falsedepthWrite: falseblendState:targets:- blend: tr…

Charles 網絡抓包工具詳解與實戰指南

文章目錄 導讀軟件版本Charles基本原理核心功能下載及安裝界面介紹網絡包展示 常用場景介紹PC 端網絡抓包移動端網絡抓包PC 端配置手機端配置 開啟 SSL 代理PC 端和移動端 CA 證書安裝Charles 直接安裝Charles 下載 CA 文件手動安裝 常用操作請求重發請求改寫、動態改寫斷點&am…

Qt+SQLITE數據庫設計的會員卡管理系統

一、前言 本項目演示在QT中使用SQLITE數據庫存儲數據管理的過程。當前以會員卡管理系統為例,寫了一個界面,完成會員卡的注冊,添加,充值,查詢,注銷,導出顧客信息EXECL表格 等功能的實現。 演示 SQLITE數據庫的建表、增、刪、改、查等語句功能實現。 SQLite是一款輕型的…

計算機網絡——物理層相關習題(計算機專業考研全國統考歷年真題)

目錄 2012-34 原題 答案 解析 2018-34 原題 答案 解析 2009/2011-34 原題 答案 解析 2016-34 原題 答案 解析 2014-35/2017-34 原題 答案 解析 2013-34 原題 答案 解析 2015-34 原題 答案 解析 物理層的協議眾多,這是因為物理層…

為啥 有了錘子,看啥都是釘子?

壞處:有了錘子,看啥都是釘子,有何壞處? 事倍功半,甚至適得其反。比如具有高并發設計經驗的人,在初創系統初期,就設計高并發架構,其復雜度大概率無法支持試點業務快速落地&#xff0…

【DevOps】Git 圖文詳解(九):工作中的 Git 實踐

本系列包含: Git 圖文詳解(一):簡介及基礎概念Git 圖文詳解(二):Git 安裝及配置Git 圖文詳解(三):常用的 Git GUIGit 圖文詳解(四)&a…

【SpringMVC】 三層架構

一.lombok工具包 中央倉庫查找這個工具包:https://mvnrepository.com/ 給類添加Data注解就可以獲取gettter和setter方法 , 這樣我們就不必寫getter 和 setter 方法. 也可以給成員屬性添加單獨的getter 和 setter , 針對某個成員屬性單獨添加setter或setter方法. 二.如果使用spr…

ORACLE手動建庫

1.確定oracle的實例名,以及數據庫名 實例名稱: ORACLE_SIDtest 數據庫名稱: test 2.手工創建如下目錄: /oracle/admin/test/adump --對應的是spfile里參數audit_file_dest …

一起學docker系列之七docker容器卷技術

目錄 1 為什么使用容器數據卷?2 數據卷的特點和優勢3 使用數據卷的方法3.1 創建容器并掛載數據卷3.2 容器間數據卷的共享與繼承 4 數據卷的權限設置5 注意事項5.1 解決權限問題5.2 路徑自動創建 結語 對于容器化應用程序的數據管理和持久化,Docker 數據卷…

鏈表的回文結構

題目描述 題目鏈接:鏈表的回文結構_牛客題霸_牛客網 (nowcoder.com) 題目分析 我們的思路是: 找到中間結點逆置后半段比對 我們可以簡單畫個圖來表示一下: ‘ 奇數和偶數都是可以的 找中間結點 我們可以用快慢指針來找中:l…

如何實現圖片輪播(python版)

為了實現圖片自動輪播,我們可以使用Python編寫一個簡單的腳本。首先,我們需要安裝一個名為Pillow的庫來處理圖片。在命令行中輸入以下命令進行安裝: pip install Pillow 接下來,我們編寫一個名為image_slideshow.py的腳本&#x…

leetcode.884——字符串分割(substr),哈希(unordered_map)的練習

884. 兩句話中的不常見單詞 句子 是一串由空格分隔的單詞。每個 單詞 僅由小寫字母組成。 如果某個單詞在其中一個句子中恰好出現一次,在另一個句子中卻 沒有出現 ,那么這個單詞就是 不常見的 。 給你兩個 句子 s1 和 s2 ,返回所有 不常用…

成為AI產品經理——模型構建流程(下)

目錄 1.模型訓練 2.模型驗證 3.模型融合 4.模型部署 上節課我們講了模型設計、特征工程,這節課我們來講模型構建剩下的三個部分:模型訓練、模型驗證和模型融合。 1.模型訓練 模型訓練就是要不斷地訓練、驗證、調優直至讓模型達到最優。 那么怎么達…