Django之中間件

引入

1、Django自帶7個中間件,每個中間件都有各自的功能


2、django能夠自定義中間件


3、使用場景:

? ? ? ? 1. 全局身份校驗

? ? ? ? 2. 全局用戶權限校驗

? ? ? ? 3. 全局訪問頻率的校驗

? ? ? ? ......

【1】什么是中間件

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

【2】中間件的作用

  • 【2.1】認證和授權

    • 中間件可以在請求到達視圖之前進行用戶認證和權限認證,只有經過授權的用戶才能訪問敏感的資源
  • 【2.2】請求響應和處理

    • 中間件可以在請求到達視圖之前進行預處理
      • 例如請求頭信息,檢查請求參數的合法性操作
    • 在視圖函數返回響應給客戶端之前,中間件還可以對響應進行后處理
      • 通知還可以添加額外的響應頭,包裝響應數據等操作
  • 【2.3】異常處理

    • 中間件可以捕獲視圖函數中可能拋出的異常,并做出相應的處理
      • 例:記錄異常日志,返回自定義錯誤信息
  • 【2.4】性能優化

    • 通過中間件,可以對性能進行檢測,緩存處理,壓縮響應,提升網站整體性能等操作
  • 【2.5】示例

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

【3】Django中間件是Django的門戶

請求操作和響應操作都需要經過中間件

?

1、請求來的時候需要先經過中間件才能真正到達后盾

2、響應返回的時候也要經過中間件后才能才能響應返回出去

【4】Django默認的7個中間件

【4.1】SecurityMiddleware

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

【4.2】SessionMiddleware

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

【4.3】CommonMiddleware

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

【4.4】CsrfViewMiddleware

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

【4.5】AuthenticationMiddleware

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

【4.6】MessageMiddleware

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

【4.7】XFrameOptionsMiddleware

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

【5】中間件方法(5個)?

【5.1】process_request? ------- 必須掌握

  • (1)執行順序
    • 按照配置文件中的中間件從上往下執行
    • 每一個請求來的時候都需要經過process_request方法
    • 該方法有一個request參數
  • (2)沒有定義process_request方法
    • 沒有定義就直接跳過process_request
  • (3)定義了返回值
    • 如果在自定義的中間件中定義了返回了,那么請求將不再繼續執行
  • (4)總結
    • process_request方法就是用來做全局相關的所有限制功能
    • 該方法在每個請求到達視圖之前被調用,可以對請求進行預處理。
    • 它接收一個HttpRequest對象作為參數,并且沒有返回值。

例:

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

【5.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

【5.3】process_view

  • 路由匹配成功后執行視圖函數之前
  • 會自動執行中間件里面的該方法
  • 順序是按照配置文件中注冊的中間件從上而下的順序執行
  • 該方法在請求到達視圖之前被調用,在視圖函數執行前執行。
    • 可以在此處進行一些操作
    • 如修改請求參數或進行記錄等。
  • 它接收一個HttpRequest對象和一個視圖函數作為參數,并且可以返回一個HttpResponse對象或None。

示例:

class LoggingMiddleware:def process_view(self, request, view_func, view_args, view_kwargs):# 在這里記錄日志logger.info(f"Request received: {request.path}")# 返回None,繼續執行原視圖函數return None

【5.4】process_template_response

  • 返回的 HttpResponse 對象有 render 屬性的時候才會觸發
  • 順序是按照配置文件中注冊了的中間件從下往上依次經過
  • 該方法在視圖函數返回一個TemplateResponse對象時調用。
    • 可以在此處修改模板響應
    • 例如添加全局的上下文數據或進行額外的渲染操作。
  • 它接收一個HttpRequest對象和一個TemplateResponse對象作為參數,并且必須返回一個TemplateResponse對象。

示例:

class GlobalContextMiddleware:def process_template_response(self, request, response):# 在這里添加全局的上下文數據response.context_data['global_data'] = "Global Value"return response

【5.5】process_exception

  • 當視圖函數中出現異常的情況下觸發
  • 順序是按照配置文件中注冊了的中間件從下往上依次經過
  • 該方法在視圖函數拋出異常時被調用。
    • 可以在此處捕獲異常并進行處理
    • 例如返回一個定制的錯誤頁面或進行日志記錄等。
  • 它接收一個HttpRequest對象和一個異常對象作為參數,可以返回一個HttpResponse對象來替代原始的異常響應。

示例:

class ErrorHandlerMiddleware:def process_exception(self, request, exception):# 在這里處理異常if isinstance(exception, CustomException):# 如果自定義異常,返回一個定制的錯誤頁面return render(request, 'error.html', {'error': str(exception)})else:# 默認情況,返回一個500服務器錯誤return HttpResponseServerError("Internal Server Error")

【6】自定義中間件

????????第一步:在視圖文件中新建一個視圖函數

def index(request):print("這是視圖函數index")return HttpResponse("index 的返回值")

? ? ? ? 第二步:在路由文件中配置路由

from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/',views.index),
]

? ? ? ? 第三步:創建一個py文件,在py文件中寫自定義中間件

# -*-coding: Utf-8 -*-
# @File : my_middle .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/17# 引入父類
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 方法")

? ? ? ? 注意:在自定義中間件的時候必須要繼承父類MiddlewareMixin

????????

????????引入父類:

from django.utils.deprecation import MiddlewareMixin

第四步:在配置文件的中間件中加入自定義中間件

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',
]

【6.1】總結

1、如果在第一個 process_request 方法就已經返回了 HttpResponse 對象,那么響應被返回的時候是經過所有的中間件里面的 process_response 方法還是會發生其他?

????????

????????????????會直接走同級別的 process_response 方法 ,然后直接返回

2、flask框架的中間件也有一個類似的方法

????????

????????但是flask返回數據就必須經過所有中間件里面的 process_response 方法

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

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

相關文章

python運行jackhmmer二進制命令的包裝器類

jackhmmer 是 HMMER 軟件套件中的一個工具,用于進行高敏感度的蛋白質序列比對。HMMER(Hidden Markov Model based on profile)是一套用于分析蛋白質序列的工具,它使用隱藏馬爾可夫模型(HMM)來建模蛋白質家族…

nodejs微信小程序+python+PHP -留學信息查詢系統的設計與實現-安卓-計算機畢業設計

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性:…

543. 二叉樹的直徑 --力扣 --JAVA

題目 給你一棵二叉樹的根節點,返回該樹的 直徑 。 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。 兩節點之間路徑的 長度 由它們之間邊數表示。 解題思路 最長長度可以理解為左子樹最長路徑加上右子樹最長…

MySQL錯誤之ONLY_FULL_GROUP_BY

報錯信息: 翻譯: 對該報錯的解釋 所以,實際上該報錯是由于在SQL查詢語句中有group by,而這個包含group by的SQL查詢寫的并不規范導致的,這個ONLY_FULL_GROUP_BY模式開啟之后檢查就會很嚴格,如果select列表…

uniapp為什么能支持多端開發?uniapp底層是怎么做的?

文章目錄 前言uniapp為什么能支持多端開發?uniapp底層是怎么做條件編譯uniapp的語法uniapp如何編譯為不同端的代碼uniapp的底層是如何做平臺特性適配的呢?后言 前言 hello world歡迎來到前端的新世界 😜當前文章系列專欄:uniapp &…

【lua】記錄函數名和參數(為了延后執行)

需求背景 一個服務緩存玩家信息到對象里,通過對象的函數定時同步到數據庫中,如果玩家掉線 清空對象,但是后續步驟導致對象數據需要變更,對象不存在, 就不方便變更了,怎么處理? 方案思考 1.臨…

計算機網絡——路由

文章目錄 1. 前言:2. 路由基礎2.1. 路由的相關概念2.2. 路由的特征2.3. 路由的過程 3 路由協議3.1. 靜態路由:3.2. 動態路由:3.2.1. 距離矢量協議3.2.2. OSPF協議:3.2.2.1.OSPF概述OSPF的工作原理路由計算功能特性 3.2.2.2.OSPF報…

【Kafka】Java整合Kafka

1.引入依賴 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.3.1</version></dependency> 2.搭建生產者 package com.wen.kafka;import org.apache.kafka.clients.produ…

Vuejs+ElementUI搭建后臺管理系統框架

文章目錄 1. Vue.js 項目創建1.1 vue-cli 安裝1.2 使用 vue-cli 創建項目1.3 文件/目錄介紹1.4 啟動 Web 服務 2. 集成 Vue Router 前端路由2.1 Vue Router 是什么2.2 集成 Vue Router 方法2.3 使 Vue Router 生效 3. 集成 Vuex 組件3.1 Vuex 是什么3.2 集成 Vuex 方法3.3 使 V…

2023全球數字貿易創新大賽-人工智能元宇宙-4-10

目錄 競賽感悟: 創業的話 好的項目 數字工廠,智慧制造:集群控制的安全問題

dlv 安裝與使用

dlv 安裝 第一步&#xff1a; # git clone https://github.com/go-delve/delve # cd delve # make install 第二步&#xff1a; # ln -s /root/go/bin/dlv /usr/local/bin/dlv 第三步&#xff1a; # dlv version Delve Debugger Version: 1.21.2 Build: d6f215b27b6d8a4e4…

Excel中出現“#NAME?”怎么辦?(文本原因)

excel 單元格出現 #NAME? 錯誤的原因有二&#xff1a; 函數公式輸入不對導致 #NAME? 錯誤。 在單元格中字符串的前面加了號&#xff0c;如下圖中的--GoJG7sEe6RqgTnlUcitA&#xff0c;本身我們想要的是--GoJG7sEe6RqgTnlUcitA&#xff0c;但因為某些不當的操作在前面加了號&…

vue+SpringBoot的圖片上傳

前端VUE的代碼實現 直接粘貼過來element-UI的組件實現 <el-uploadclass"avatar-uploader"action"/uploadAvatar" //這個action的值是服務端的路徑&#xff0c;其他不用改:show-file-list"false":on-success"handleAvatarSuccess"…

萬界星空科技商業開源MES/免費MES/低代碼MES

萬界星空科技商業開源MES可以提供包括制造數據管理、計劃排程管理、生產調度管理、庫存管理、質量管理、人力資源管理、工作中心/設備管理、工具工裝管理、采購管理、成本管理、項目看板管理、生產過程控制、底層數據集成分析、上層數據集成分解等管理模塊&#xff0c;打造一個…

141.【Git版本控制-本地倉庫-遠程倉庫-IDEA開發工具全解版】

Git-深入挖掘 (一)、Git分布式版本控制工具1.目標2.概述(1).開發中的實際常見(2).版本控制器的方式(3).SVN (集中版本控制器)(4).Git (分布版本控制器)(5).Git工作流程圖 (二)、Git安裝與常用命令1.Git環境配置(1).安裝Git的操作(2).Git的配置操作(3).為常用的指令配置別名 (可…

element中el-switch的v-model自定義值

一、問題 element中的el-switch的值默認都是true或false&#xff0c;但是有些時候后端接口該字段可能是0或者1&#xff0c;如果說再轉換一次值&#xff0c;那就有點太費力了。如下所示&#xff1a; <template><el-switchinactive-text"否"active-text&quo…

【Seata源碼學習 】篇四 TM事務管理器是如何開啟全局事務

TM發送 單個或批量 消息 以發送GlobalBeginRequest消息為例 TM在執行攔截器鏈路前將向TC發送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(String applicationId, String transactionServi…

操作系統發展過程--單道批處理系統、多道批處理系統、分時系統、實時系統

一、單道批處理系統 計算機早期&#xff0c;為了能提高利用率&#xff0c;需要盡量保持系統的連續運行&#xff0c;即在處理完一個作業之后&#xff0c;緊接著處理下一個作業&#xff0c;以減少機器的空閑等待時間 1.單道批處理系統的處理過程 為了實現對作業的連續處理&…

51單片機應用從零開始(七)·循環語句(if語句,swtich語句)

51單片機應用從零開始&#xff08;一&#xff09;-CSDN博客 51單片機應用從零開始&#xff08;二&#xff09;-CSDN博客 51單片機應用從零開始&#xff08;三&#xff09;-CSDN博客 51單片機應用從零開始&#xff08;四&#xff09;-CSDN博客 51單片機應用從零開始&#xff08;…

數倉成本下降近一半,StarRocks 存算分離助力云覽科技業務出海

成都云覽科技有限公司傾力打造了鳳凰瀏覽器&#xff0c;專注于為海外用戶提供服務&#xff0c;公司致力于構建一個全球性的數字內容連接入口&#xff0c;為用戶帶來更為優質、高效、個性化的瀏覽體驗。 作為數據驅動的高科技公司&#xff0c;從數據中挖掘價值一直是公司核心任務…