Django(十、中間件)

文章目錄

  • 一、中間件的介紹
      • 中間件有什么用
      • 中間件功能
      • 自定義中間
      • 中間件的順序

一、中間件的介紹

中間件顧名思義,是介于request與response處理之間的一道處理過程,相對比較輕量級,并且在全局上改變django的輸入與輸出。因為改變的是全局,所以需要謹慎實用,用不好會影響到性能

中間件流程圖
在這里插入圖片描述

中間件有什么用

如果你想修改請求,例如被傳送到view中的HttpRequest對象。 或者你想修改view返回的HttpResponse對象,這些都可以通過中間件來實現。

可能你還想在view執行之前做一些操作,這種情況就可以用 middleware來實現。

Django默認的中間件:(在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件,如下圖)

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

這七個中間件程序會在請求來時自上而下依次的處理request請求,在響應走時自下而上依次處理response響應。

中間件功能

網站訪問頻率的校驗 用戶權限的校驗等全局類型的功能需求

前期我們要訪問post請求,中間件的第四個字符串妨礙了簡單post請求,初期階段我們將其注釋掉了

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

這七個字符串實際上對應的是中間件程序存儲的路徑
在這里插入圖片描述
我們順著路徑的文件,點進去可知源碼
在這里插入圖片描述
由上述圖可知

1.七個中間件都繼承了MiddlewareMixin類
2.都幾乎有process_request和process_response函數
3.都必須傳入參數
process_request需要傳入request參數;
process_response需要傳入request和response兩個參數,必須返回response。

自定義中間

如何自定義中間件
1.創建存儲自定義中間件代碼的py文件或者目錄(如果中間件很多)
2.參考自帶中間件的代碼編寫類并繼承
3.在類中編寫五個可以自定義的方法
4.一定在配置文件中注冊中間件才可以生效
在這里插入圖片描述
編寫自定義的中間件(在mymiddlie中編寫MyMiddleware001)
在這里插入圖片描述
編寫好中間件,一定要去settings里的Middleware中注冊自定義的中間件
在這里插入圖片描述

中間件的順序

我們只是定義了process_reqtest和process_response函數,我們想看看執行的順序的,我們可以做一個小測試

mymiddle.py(自定義的中間件)

from django.utils.deprecation import MiddlewareMixinclass MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')def process_response(self,request,response):print('from MyMiddleware001 process_response')return responseclass MyMiddleware002(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware002 process_request')def process_response(self,request,response):print('from MyMiddleware002 process_response')return response

當我們從網頁向URL發送請求時,請求通過了網關接口到達了中間件,在中間件的執行過程是自上而下,從而經過路由層>>視圖層>>>等,當響應是經過中間件的時候是自下而上的,返回給網關接口,再打包給瀏覽器,

在這里插入圖片描述
打印結果
在這里插入圖片描述
如果我們還想測試如果遇到HttpResponse對象,會怎么樣?看下面的解釋

django中間件兩個基本方法
process_request
1.請求來的時候會從上往下依次經過每一個注冊的中間件里面的該方法 如果沒有則直接跳過
2.如果該方法自己返回了HttpResponse對象那么不再往后執行而是直接原路返回

如果請求遇到了process_request方法,該方法返回了HttpResponse對象,如下

class MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')return HttpResponse('你沒有權限執行下面的中間件')  # 遇到了HttpResponse對象def process_response(self,request,response):print('from MyMiddleware001 process_response')return response

他經過的行徑如黃色箭頭,請求通過網關到中間件自上而下到達了中間件MyMiddleware001,就會直接執行MyMiddleware001的process_response方法,直接原路返回,不會走下面的中間件MyMiddleware002。

在這里插入圖片描述
process_response

1.響應走的時候會從下往上依次經過每一個注冊了的中間件里面的該方法 如果沒有則直接跳過
2.該方法有兩個先request和response 形參response指代的就是后端想要返回給前端瀏覽器的數據 該方法必須返回該形參 也可以替換from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
class MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')def process_response(self,request,response):print('from MyMiddleware001 process_response')# return responsereturn HttpResponse('中間1直接返回了,返回了response')

注意:
1.一個請求經過了中間件,如果在執行process_request方法的時候直接返回了HttpResponse對象那么會原路返回執行自定義中間件的process_response 不是執行所有。

? 2.在flask中,是從最底層中間程序的響應函數開始執行的

django中間件三個了解得方法

1.process_view路由匹配成功之后執行視圖函數/類之前自動觸發(順序同process_request)
2.process_exception視圖函數/類執行報錯自動觸發(順序同process_response)
3.process_template_response視圖函數/類返回的HttpResponse對象含有render并且對應一個方法的時候自動觸發(順序同process_response)

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

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

相關文章

U盤啟動制作工具Rufus

U盤啟動制作工具Rufus 下載U盤啟動制作工具Rufus,進入Rufus官網:http://rufus.ie/en/,打開之后往后滑動,找到download即可點擊下載。 需要插入U盤 首先需要插入U盤,如果U盤有重要文件一定要備份,然后右鍵…

mysql安裝親測有效

http://t.csdnimg.cn/UHuy4

Grails 啟動

Grails系列 Grails項目啟動 文章目錄 Grails系列Grails一、項目創建二、可能的問題1.依賴下載2.項目導入到idea失敗3.項目導入到idea后運行報錯 Grails Grails是一款基于Groovy語言的Web應用程序框架,它使用了許多流行的開源技術,如Spring Framework、…

Go語言初始化已有環境,跟蹤已有依賴環境

在Go語言中,go.mod文件是Go模塊的管理文件,用于跟蹤和管理項目的依賴關系。go.sum 文件是 Go 語言模塊的另一個關鍵文件,它記錄了項目依賴的確切版本以及相應的哈希值。如果你得到了一個包含go.mod和go.sum文件的Go代碼,&#xff…

內衣洗衣機怎么選?性價比高的小型洗衣機推薦

在機器解放了雙手的時代中,洗衣機走進了千家萬戶,雖然在某種程度上緩解了人們手洗衣服的壓力,但還是有不少人選擇了人工手洗自己的內衣內褲,甚至連襪子都是手工洗的,這讓人很是郁悶,倒不是說洗衣機不方便&a…

SpringBoot整合SpringSecurity+jwt+knife4生成api接口(從零開始簡單易懂)

一、準備工作 ①&#xff1a;創建一個新項目 1.事先創建好一些包 ②&#xff1a;引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>&…

可以遠程控制電腦桌面的軟件有哪些?

隨著電腦辦公的普及&#xff0c;人們對于遠程控制電腦的需求也越來越大。遠程控制電腦技術能夠讓用戶在不同地點的電腦之間進行操作和訪問&#xff0c;能夠提高工作效率。可以遠程控制電腦桌面的軟件有哪些&#xff1f; 1. 遠程監控電腦軟件 需要安裝在被控制端電腦&#xff…

【cppcheck 靜態代碼分析工具使用教程】

cppcheck 是一個流行的靜態代碼分析工具,用于 C 和 C++ 程序。它可以幫助檢測代碼中的錯誤、未定義的行為、內存泄漏等。在 Ubuntu 系統上使用 cppcheck 的基本步驟和示例如下: 安裝 cppcheck 打開終端。使用以下命令安裝 cppcheck:sudo apt-get update sudo apt-get insta…

linux -系統通用命令查詢

有時候內網環境下&#xff0c;系統有些命令沒有安裝因此掌握一些通用的linux 命令也可以幫助我們解決一些問題查看 1.查看系統內核版本 uname -r2.查看系統版本 cat /etc/os-release3. 查看cpu 配置 lscpu4.查看內存信息 free [參數] 中各個數值的解釋如下表 數值解釋t…

4.并發中的各種鎖概念

目錄 概述鎖分類按上鎖方式劃分按特性劃分悲觀鎖/樂觀鎖重入鎖/不可重入鎖公平鎖/非公平鎖獨享鎖/共享鎖 其它自旋鎖分段鎖無鎖/偏向鎖/輕量級鎖/重量級鎖 結束 概述 java 鎖分類&#xff0c;雖是概念&#xff0c;很常見。 鎖分類 按上鎖方式劃分 鎖關鍵字解釋隱式鎖synchr…

提高工作效率的寶藏網站和寶藏工具(高級版)

一、參考資料 親測&#xff1a;你這些網站都不知道&#xff0c;哪來時間去摸魚&#xff1f; 提高工作效率的寶藏網站和寶藏工具&#xff08;基礎版&#xff09; 二、好用的網站 HelloGitHub - 開源項目平臺 HelloGitHub 是一個分享有趣、 入門級開源項目的平臺。 希望大家能…

MySQL-02-InnoDB存儲引擎

實際的業務系統開發中&#xff0c;使用MySQL數據庫&#xff0c;我們使用最多的當然是支持事務并發的InnoDB存儲引擎的這種表結構&#xff0c;下面我們介紹下InnoDB存儲引擎相關的知識點。 1-Innodb體系架構 InnoDB存儲引擎有多個內存塊&#xff0c;可以認為這些內存塊組成了一…

qgis添加arcgis的mapserver

左側瀏覽器-ArcGIS地圖服務器-右鍵-新建連接 Folder: / 展開-雙擊圖層即可

oracle 表樹形結構查詢遞歸查詢

簡介&#xff1a; WITH RECURSIVE 是一種在關系型數據庫中處理遞歸查詢的語法。 舉例&#xff1a; 假設我們有一個樹形結構數據表 tree_table&#xff0c; 包含節點的 ID、父節點的 ID 和節點名稱等字段。 示例表數據&#xff1a; --------------- | id | pid | name | ----…

物聯網AI MicroPython學習之語法 I2S音頻總線接口

學物聯網&#xff0c;來萬物簡單IoT物聯網&#xff01;&#xff01; I2S 介紹 模塊功能: I2S音頻總線驅動模塊 接口說明 I2S - 構建I2S對象 函數原型&#xff1a;I2S(id, sck, ws, sd, mode, bits, format, rate, ibuf)參數說明&#xff1a; 參數類型必選參數&#xff1f…

關于接口測試自動化的總結與思考!

序 近期看到阿里云性能測試 PTS 接口測試開啟免費公測&#xff0c;本著以和大家交流如何實現高效的接口測試為出發點&#xff0c;本文包含了我在接口測試領域的一些方法和心得&#xff0c;希望大家一起討論和分享&#xff0c;內容包括但不僅限于&#xff1a; 服務端接口測試介…

Vatee萬騰的科技冒險:vatee創新力量的前沿發現

在當今飛速發展的科技潮流中&#xff0c;Vatee萬騰以其獨特的創新力量成為前沿的引領者。這場科技冒險不僅僅是技術的迭代&#xff0c;更是一次前所未有的前沿發現之旅&#xff0c;讓我們一同深入探索Vatee萬騰的科技冒險&#xff0c;感受vatee創新力量的前沿奇跡。 Vatee萬騰將…

【Thumbnailator】圖片壓縮、水印、格式修改一網打盡

前言&#xff1a; 對于javaweb服務端開發人員&#xff0c;圖片資源的管理總是繞不開的一環。很多網站上都會提供上傳圖片這個功能&#xff0c;而現代數碼設備拍攝出來的都是高清圖片&#xff0c;分辨率很高&#xff0c;占用的空間也很大。物理存儲的問題還算容易解決&#xff0…

機器學習---最大似然估計和貝葉斯參數估計

1. 估計 貝葉斯框架下的數據收集&#xff0c;在以下條件下我們可以設計一個可選擇的分類器 : P(wi) (先驗)&#xff1b;P(x | wi) (類條件密度) 但是。我們很少能夠完整的得到這些信息! 從一個傳統的樣本中設計一個分類器&#xff1a; ①先驗估計不成問題 ②對類條件密度…

蘋果企業簽名失敗常見的問題

蘋果企業簽名失敗的常見問題主要有以下幾種&#xff1a; 證書過期或無效&#xff1a;蘋果開發者需要定期更新他們的簽名證書&#xff0c;以確保其有效性。一旦證書過期&#xff0c;相關應用將無法正常工作。證書不匹配&#xff1a;如果使用的證書與應用程序的Bundle ID不匹配&…