Django中間件

目錄

一.介紹

1.什么是Django中間件

2.作用:

3.示例

二.Django請求生命周期流程圖

三.Django中間件是Django的門戶

四.中間件方法

1.必須掌握的中間件方法

(1)process_request:

示例:

2.需要了解的中間件方法

(1)process_view

示例:

(2)process_template_response

示例:

(3)process_exception

示例:

五.自定義中間件

1.process_request

1.路由層

2.視圖層

3.配置文件

4.自定義中間件

5.總結

(1)執行順序

(2)沒有定義process_request

(3)定義了返回值

(4)總結

2.process_response

3.小結


一.介紹

1.什么是Django中間件

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

2.作用:

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

3.示例

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

二.Django請求生命周期流程圖

  1. 客戶端發出HTTP請求
  2. 請求被Web服務器接收并傳遞給Django應用程序
  3. Django中的WSGI中間件開始處理請求,并可進行一些預處理操作
  4. 中間件將請求傳遞給URL分發器(URL Dispatcher)
  5. URL分發器根據URL模式將請求路由到相應的視圖函數或處理器(View/Handler)
  6. 視圖函數或處理器執行相應的業務邏輯,可能會與數據庫等外部資源交互
  7. 視圖函數或處理器返回一個HTTP響應對象
  8. 響應對象經過中間件,可以在此進行后處理操作
  9. 響應被發送給Web服務器
  10. Web服務器將響應發送回客戶端

三.Django中間件是Django的門戶

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

四.中間件方法

Django支持程序員自定義中間件并且給程序員5個中間件

1.必須掌握的中間件方法

(1)process_request:

  1. 執行順序
    ? ? ? ? 請求來的時候需要經過每一個中間件的process_request方法
    ? ? ? ? 結果的順序是按照配置文件中注冊的中間件從上往下的順序執行的
  2. 沒有定義process_request
    ? ? ? ? 如果沒有定義這個方法就跳過這個中間件
  3. 定義了返回值
    ? ? ? ? 如果在自定義中間件中定義了返回值(三板斧),那么請求將不再繼續執行,而是直接原路返回(校驗失敗不允許訪問)
  4. 總結
    ? ? ? ? process_request方法就是用來做全局相關的所有限制功能
  • 該方法在每個請求到達視圖之前被調用,可以對請求進行預處理
    • 例如,進行身份驗證,訪問控制或請求日志記錄等操作
  • 它接收一個HttpRequest對象和HttpResponse對象作為參數,并且必須返回一個HttpResponse對象

示例:

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

2.需要了解的中間件方法

(1)process_view

  1. 路由匹配成功后執行視圖函數之前
  2. 會自動執行中間件里面的該方法
  3. 順序是按照配置文件中注冊的中間件從上而下的順序執行
  • 該方法在請求到達視圖之前被調用,在視圖函數執行前執行。
    • 可以在此處進行一些操作
    • 如修改請求參數或進行記錄等。
  • 它接收一個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

(2)process_template_response

  1. 返回的 HttpResponse 對象有 render 屬性的時候才會觸發

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

示例:

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

(3)process_exception

  1. 當視圖函數中出現異常的情況下觸發
  2. 順序是按照配置文件中注冊了的中間件從下往上依次經過
  • 該方法在視圖函數拋出異常時被調用。
    • 可以在此處捕獲異常并進行處理
    • 例如返回一個定制的錯誤頁面或進行日志記錄等。
  • 它接收一個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")

五.自定義中間件

1.process_request

1.路由層

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

2.視圖層

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

3.配置文件

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

4.自定義中間件

# -*-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 方法")

5.總結

(1)執行順序
  • 請求來的時候需要經過每一個中間件的 process_request 方法
  • 結果的順序是按照配置文件中注冊的中間件從上往下的順序執行的
(2)沒有定義process_request
  • 如果沒有定義這個方法,就跳過這個中間件
(3)定義了返回值
  • 如果在自定義中間件中定義了返回值(三板斧),那么請求將不再繼續執行,而是直接原路返回(校驗失敗不允許訪問)
(4)總結
  • 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
  • 響應被返回的時候需要結束每一個中間件里面的 process_response 方法

    • 該方法有兩個額外的參數
      • request
      • response
  • 該方法必須返回 HttpResponse 對象

    • 默認是response
    • 支持自定義
  • 順序是按照配置文件中注冊過的中間件從下往上依次經過

    • 如果沒有定義,則跳過,校驗下一個

3.小結

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

    • 會直接走同級別的 process_response 方法 ,然后直接返回
  • flask框架的中間件也有一個類似的方法

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

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

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

相關文章

新生兒散光:原因、科普和注意事項

引言: 散光是一種常見的眼睛問題,雖然在新生兒時期相對較少見,但了解其原因、科普相關知識,并提供一些建議的注意事項,對于嬰兒的視力健康至關重要。本文將深入探討新生兒散光的原因、相關科普知識,并為父…

大廠前沿技術導航

百度Geek說 - 知乎 騰訊技術 - 知乎 美團技術團隊

YaRN方法:無需微調,高效擴展語言模型上下文窗口/螞蟻集團與浙大發布原生安全框架v1.0,引領企業網絡安全新時代 |魔法半周報

我有魔法?為你劈開信息大海? 高效獲取AIGC的熱門事件🔥,更新AIGC的最新動態,生成相應的魔法簡報,節省閱讀時間👻 🔥資訊預覽 YaRN方法:無需微調,高效擴展語言模型上下文窗口 螞蟻…

2023 hnust 湖南科技大學 信息安全管理課程 期中考試 復習資料

前言 ※老師沒畫重點的補充內容★往年試卷中多次出現或老師提過的,很可能考該筆記是奔著及格線去的,不是奔著90由于沒有聽過課,部分知識點不一定全,答案不一定完全正確 題型 試卷有很多題是原題 判斷題(PPT&#xff…

python-冒泡排序

冒泡排序 (穩定) O(n^2) (穩定:表示相等的數,相對位置會不會改變) 冒泡排序(Bubble Sort)是一種簡單的排序算法,它通過多次遍歷待排序的元素,比較相鄰兩個元素的大小并交換它們&…

Kafka 常用功能總結(不斷更新中....)

kafka 用途 業務中我們經常用來兩個方面 1.發送消息 2.發送日志記錄 kafka 結構組成 broker:可以理解成一個單獨的服務器,所有的東西都歸屬到broker中 partation:為了增加并發度而做的拆分,相當于把broker拆分成不同的小塊&…

黨建信息管理系統源碼 支持在線交黨費 附帶完整的搭建教程

傳統的黨建管理模式通常采用手工方式,不僅效率低下,而且容易出錯。隨著組織規模的擴大和黨員數量的增加,這種管理方式已經無法滿足現實需求。此外,傳統的黨建管理模式缺乏在線交黨費功能,給黨員帶來不便。因此&#xf…

Kubernetes 離線部署 Spinnaker

離線部署 Spinnaker 離線部署 spinnaker 需要提前準備以下依賴項 halyard 安裝工具:該hal命令的apt源地址https://us-apt.pkg.dev/projects/spinnaker-community位于國外halyard boms物料清單:Spinnaker 將其halyard boms配置存儲在公共谷歌云存儲 ( g…

Divisibility Trick

Dmitry最近學會了一個簡單的規則來檢查一個整數是否可以被3整除。如果一個整數的位數之和可以被3整除,那么它就可以被3所整除。 后來他還了解到,同樣的規則也可以用來檢查一個整數是否可以被9整除。如果一個整數的位數之和可以被9整除,那么它…

如何在 Web 應用程序中查找端點?

如何在 Web 應用程序中查找端點? 這篇文章主要講述了如何在網絡應用中找到端點。以下是文章的主要要點: 端點是網絡服務的訪問地址,通過引用這個URL,客戶可以訪問服務提供的操作。端點提供了尋址Web服務端點所需的信息。 HTTP消息是服務器和客戶端之間交換數據的方式,包…

Anaconda深度學習環境配置命令參考

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 Anaconda深度學習環境配置 Anaconda 管理1. 檢查 Anaconda 版本2. 獲取版本號3. 列出所有的虛擬環境4. 查看環境管理的全部命令幫助5. conda升級6. conda升級后釋放空間 Anac…

2024免費MacBook清理工具CleanMyMac X4.15

CleanMyMac X 是一款專業的Mac清理軟件,可智能清理mac磁盤垃圾和多余語言安裝包,快速釋放電腦內存,輕松管理和升級 Mac 上的應用。同時 CleanMyMac X 可以強力卸載惡意軟件,修復系統漏洞,一鍵掃描和優化 Mac 系統&…

競賽知識點12【樹狀數組】

文章目錄 1、思路引入2、求lowbit(n)3、對某個元素進行加法操作(單點更新)4、查詢前綴和5、統計A[x]~A[y] 的值1、思路引入 如果線段樹每個節點維護的是對應區間的和,比如說計算從 s s s 到 t t t 的和 ( a s + … + a t ) (a_s+…+a_t) (as?+…+at?),在基于線段樹的實…

【ChatGLM3-6B】Docker下部署及微調

【ChatGLM2-6B】小白入門及Docker下部署 注意:Docker基于鏡像中網盤上上傳的有已經做好的鏡像,想要便捷使用的可以直接從Docker基于鏡像安裝看Docker從0安裝前提下載啟動訪問 Docker基于鏡像安裝容器打包操作(生成鏡像時使用的命令&#xff0…

Nginx常用負載均衡策略

Nginx常用負載均衡策略 輪詢(默認) 注意:這里的輪詢并不是每個請求輪流分配到不同的后端服務器,與ip_hash類似,但是按照訪問url的hash結果來分配請求,使得每個url定向到同一個后端服務器,主要…

什么手機30萬?VERTU唐卡手機頂配56.8萬

近日,一則新聞在社交媒體上引發了廣泛關注。一名男子遺失了一部價值30萬的VERTU唐卡定制款手機,而一位女士在撿到這部手機后,誤以為是一部普通的老年機,引發了種種誤會。30萬的手機是什么牌子?VERTU唐卡手機浮出水面 據了解,這部VERTU唐卡定制款手機是一款豪華的奢侈品定制手機…

2-Python與設計模式--前言

0-Python與設計模式–前言 一 什么是設計模式 設計模式是面對各種問題進行提煉和抽象而形成的解決方案。這些設計方案是前人不斷試驗, 考慮了封裝性、復用性、效率、可修改、可移植等各種因素的高度總結。它不限于一種特定的語言, 它是一種解決問題的思…

GoogleNet詳解

一、亮點 AlexNet、VGG都只有一個輸出層。googlenet有三個(其中兩個是輔助分類層) 二、先看看Inception結構 1、Inception 之前的網絡: AlexNet、VGG都是串行結構 Inception: 并行結構 上一層的輸出同時傳入四個并行結構&…

有了傾斜攝影,如何搭建一座智慧城市?

隨著無人機航測、傾斜攝影等全新一代測繪信息技術方法的發展,可以迅速搜集制作精細化的城市三維模型,搭建城市地理信息基礎服務架構。 近期都在重點關注的“智慧城市”究竟是什么,有什么重大作用,同時又面臨著什么難關&#xff0c…

短劇付費變現小程序源碼系統+開通會員+在線充值 附帶完整的搭建教程

大家好啊,今天小編來給大家分享一款短劇付費變現小程序源碼系統。近年來,隨著互聯網技術的飛速發展,短劇成為了一個備受矚目的領域。短劇以其簡潔、緊湊的故事情節和制作周期短、傳播速度快的特點,成為了越來越多人的選擇。然而&a…