Django筆記之中間件介紹

這一節介紹一下 Django 的中間件。

關于中間件,官方文檔的解釋為:中間件是一個嵌入 Django 系統的 request 和 response 的鉤子框架,是一個能夠全局改變 Django 輸入/輸出的系統。

我們可以這樣理解,一個 request 請求發送到 Django 系統的過程中,在經過路由和視圖的處理前,會先經過一層處理,這個處理操作可以是日志記錄,可以是登錄驗證甚至你想在系統里定義的功能,這個操作就是中間件實現的功能。

接下來我們將通過一個記錄請求的 ip 的功能的介紹來介紹一下中間件的實現流程。

以下是本篇筆記目錄:

  1. 請求經過 Django 然后返回的流程
  2. HttpRequest 和 HttpResponse 介紹
  3. 中間件的示例介紹
  4. 記錄訪問 ip 的功能實現

1、請求經過 Django 然后返回的流程

首先,前端發起一個請求,這個請求經由 web 服務器轉發給 Django 系統,在進入 Django 系統后會先經過一系列的中間件的功能處理。

這個中間件會在 settings.py 里定義,Django 系統默認自帶的中間件列表如下:

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 請求才會被進行 URL 的路徑匹配,如果匹配上,再去找相應的 views 視圖函數進行數據處理

views 處理完之后,會形成一個 response,返回,然后再次經歷這個中間件處理,因為在每一層中間件中都類似于一種嵌套,所以返回 response 的時候,是從下往上再次處理 response 的。

中間件處理結束之后再被返回出去,給到前端。

在這整個流程處理中,可以說中間件是進行了兩次操作,一個是進入的時候處理 request,一個是返回的時候處理 response。

2、HttpRequest 和 HttpResponse 介紹

我們先來看一個視圖函數:

def time_view(request):now = datetime.datetime.now()html = "<h1>now: %s</h1>abc\nabc" % nowreturn HttpResponse(html)

當 Django 接收到一個請求,系統會創建一個 HttpRequest 對象,這個對象就是上面的視圖函數里的輸入參數,request

在對數據進行處理后,系統會返回一個 HttpResponse 對象,這個就是我們 return 的內容。

在一個 HttpRequest 對象里,會包含請求的路徑、參數、請求方式、 cookie 等一切請求過來時的數據,我們可以在請求的時候根據需要存取。

在返回的 HttpResponse 中,可以是一個 html 頁面,也可以是 json 格式的數據,內容是可以自定義的,只要前端可以做相應的處理。

3、中間件的示例介紹

接下來我們定義一個中間件,結構大致如下:

# huter/middleware.pyclass SimpleMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 在請求進入視圖函數前的可以執行一些操作,針對 requestprint(request.path)response = self.get_response(request)# 在處理完請求后,可以執行一些操作,針對 response# log_response_info()return response

然后我們在 sttings.py 里引入這個中間件,我們放到 MIDDLEWARE 列表的最下面,說明這個中間件會在其他中間件處理完 request 之后再處理:


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','hunter.middleware.TestMiddleware',
]

在 SimpleMiddleware 這個類里,call() 函數會自動調用,其中有一行,response = self.get_response(request)

在這一行函數之前,可以對請求的 request 做處理,包括我們前面說的各種功能,比如日志、登錄驗證、參數格式化等

在這一行函數之后,獲取了 response,這個就是視圖函數返回的 HttpResponse,我們可以在這里對它的 response.status_code 狀態碼,和 response.content 做處理

比如前面 time_view 函數返回的內容是一個 JsonResponse:

return JsonResponse({"code": 0})

那么在這里我們可以獲取然后處理這個 HttpResponse:


def __call__(self, request):response = self.get_response(request)content = json.loads(response.content)content["msg"] = "success"response.content = json.dumps(content)return response

這里只是一個示例,因為并不是所有的 HttpResponse 都是 json 格式的數據,所以可能需要加一個 try except 做下處理

還有一個功能是我之前做過的,就是在 headers 中加一個特定的字符串,表示是我們系統專有的,用于前端判斷,這個很簡單,就是在 response 的 headers 參數中加一個鍵值對:

response.headers['system'] = 'hunter'

以上就是一個最簡單的中間件的處理方式。

process_view

除了?call?函數以外,還有一個 process_view() 的函數

這個函數是在 Django 系統調用 views 視圖函數前被調用,它的返回值是 None 或者一個 HttpResponse

如果為 None,那么系統會接著調用視圖函數,如果是 HttpResponse 作為返回值,說明系統在這里已經處理了請求,不需要再走views視圖函數,然后就會直接返回。

我們通過下面的例子來解釋這個函數作用。

4、記錄訪問 ip 的功能實現

假設我們需要禁止某一個或者某一個 ip 列表的請求訪問我們的系統

當然,這個操作,在 web 服務器那部分就可以攔截,這里就是單純舉個例子

那么我們這樣設置一個 process_view 的功能,在真正執行視圖函數(也就是url 匹配上的 view函數)前,取出這個 request 的訪問的ip,然后進行判斷,如果在 禁止列表,那么則直接返回一個禁止訪問的頁面。

class TestMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):response = self.get_response(request)return responsedef process_view(self, request, view_func, *view_args, **view_kwargs):EXCLUDE_IPS = ['192.168.1.54']if 'HTTP_X_FORWARDED_FOR' in  request.META:ip =  request.META['HTTP_X_FORWARDED_FOR']else:ip = request.META['REMOTE_ADDR']if ip in EXCLUDE_IPS:return HttpResponse('<h1>您的ip被禁止</h1>')return None

在這里,我們拿到請求的 ip 地址,去和我們定義的禁止ip列表做比較

如果在禁用列表,則直接返回 HttpResponse,不接著請求我們的服務來

否則,就返回 None,系統接收到 None 之后,會接著往下處理。

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

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

相關文章

《C語言深度解剖》.pdf

&#x1f407; &#x1f525;博客主頁&#xff1a; 云曦 &#x1f4cb;系列專欄&#xff1a;深入理解C語言 &#x1f4a8;吾生也有涯&#xff0c;而知也無涯 &#x1f49b; 感謝大家&#x1f44d;點贊 &#x1f60b;關注&#x1f4dd;評論 C語言深度解剖.pdf 提取碼:yunx

KCC@深圳開源讀書會即將舉辦,來與行業大咖面對面交流

KCC&#xff0c;全稱 KAIYUANSHE City Community&#xff08;中文&#xff1a;開源社城市社區&#xff09;是由開源社發起&#xff0c;旨在讓開源社區在每個城市落地生根的地域性開源組織。 自2023年2月份發起以來&#xff0c;我們已經在南京、上海、深圳、北京、硅谷、新加坡、…

iTOP-3568開發板使用OpenCV處理圖像-顏色轉換

本小節代碼在配套資料“iTOP-3568 開發板\03_【iTOP-RK3568 開發板】指南教程 \04_OpenCV 開發配套資料\05”目錄下&#xff0c;如下圖所示&#xff1a; cv2.cvtColor()函數功能&#xff1a; 將一幅圖像從一個色彩空間轉換到另一個色彩空間。 函數原型&#xff1a; cv2.cvt…

日常BUG—— maven編譯報錯

&#x1f61c;作 者&#xff1a;是江迪呀??本文關鍵詞&#xff1a;日常BUG、BUG、問題分析??每日 一言 &#xff1a;存在錯誤說明你在進步&#xff01; 一、問題描述 一個maven項目在由于在代碼中書寫了如下代碼&#xff1a; public static ConcurrentMap<…

DatenLord X Segmentfault直播預告 l CURP協議的工業化實踐

CURP協議 傳統單數據中心解決方案無法滿足跨數據中心的場景對性能和一致性的需求。DatenLord推出開源的分布式KV存儲Xline&#xff0c;針對多數據中心場景&#xff0c;實現數據的高性能跨云、跨數據中心共享訪問&#xff0c;并且保證數據的一致性&#xff0c;方便業務系統實現…

Nginx之lnmp架構

目錄 一.什么是LNMP二.LNMP環境搭建1.Nginx的搭建2.安裝php3.安裝數據庫4.測試Nginx與PHP的連接5.測試PHP連接數據庫 一.什么是LNMP LNMP是一套技術的組合&#xff0c;Llinux&#xff0c;Nnginx&#xff0c;Mmysql&#xff0c;Pphp 首先Nginx服務是不能處理動態資源請求&…

Android app專項測試之耗電量測試

前言 耗電量指標 待機時間成關注目標 提升用戶體驗 通過不同的測試場景&#xff0c;找出app高耗電的場景并解決 01、需要的環境準備 1、python2.7(必須是2.7&#xff0c;3.X版本是不支持的) 2、golang語言的開發環境 3、Android SDK 此三個的環境搭建這里就不詳細說了&am…

如何使用CSS實現一個純CSS的滾動條樣式?

聚沙成塔每天進步一點點 ? 專欄簡介? 使用CSS實現自定義滾動條樣式? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&#xff01;這個專欄是為那些對Web開發感興趣…

【數理知識】三維空間旋轉矩陣的歐拉角表示法,四元數表示法,兩者之間的轉換,Matlab 代碼實現

序號內容1【數理知識】自由度 degree of freedom 及自由度的計算方法2【數理知識】剛體 rigid body 及剛體的運動3【數理知識】剛體基本運動&#xff0c;平動&#xff0c;轉動4【數理知識】向量數乘&#xff0c;內積&#xff0c;外積&#xff0c;matlab代碼實現5【數理知識】最…

用Node.js吭哧吭哧擼一個運動主頁

簡單嘮嘮 某乎問題&#xff1a;人這一生&#xff0c;應該養成哪些好習慣&#xff1f; 問題鏈接&#xff1a;https://www.zhihu.com/question/460674063 如果我來回答肯定會有定期運動的字眼。 平日里也有煅練的習慣&#xff0c;時間久了后一直想把運動數據公開&#xff0c;…

火山引擎DataLeap的Data Catalog系統公有云實踐

更多技術交流、求職機會&#xff0c;歡迎關注字節跳動數據平臺微信公眾號&#xff0c;回復【1】進入官方交流群 Data Catalog是一種元數據管理的服務&#xff0c;會收集技術元數據&#xff0c;并在其基礎上提供更豐富的業務上下文與語義&#xff0c;通常支持元數據編目、查找、…

自然數的拆分問題

題目描述 任何一個大于 11 的自然數 n&#xff0c;總可以拆分成若干個小于 n 的自然數之和。現在給你一個自n&#xff0c;要求你求出 n 的拆分成一些數字的和。每個拆分后的序列中的數字從小到大排序。然后你需要輸出這些序列&#xff0c;其中字典序小的序列需要優先輸出。 輸…

搭建openGauss 5.0 一主一從復制集群

openGauss是一款支持SQL2003標準語法&#xff0c;支持主備部署的高可用關系型國產數據庫。 多種存儲模式支持復合業務場景&#xff0c;新引入提供原地更新存儲引擎。NUMA化數據結構支持高性能。Paxos一致性日志復制協議&#xff0c;主備模式&#xff0c;CRC校驗支持高可用。支…

設置返回列表元素上限

我正在「拾陸樓」和朋友們討論有趣的話題&#xff0c;你?起來吧&#xff1f;拾陸樓知識星球入口 在get_cell &#xff0c;get_nets&#xff0c;get_xx等操作時返回的值上限是100&#xff0c;后面的就用...省略了&#xff0c;如果要修改這個上限&#xff0c;需要用下面命令: s…

設計模式之七大原則

&#x1f451;單一職責原則 單一職責原則告訴我們一個類應該只有一個責任或者只負責一件事情。 想象一下&#xff0c;如果一個類承擔了太多的責任&#xff0c;就像一個人同時負責做飯、洗衣服和打掃衛生一樣&#xff0c;那么這個類會變得非常復雜&#xff0c;難以理解和維護。而…

一些Git Repo

文章目錄 Fake-TcpWow Fishing Script模擬券商柜臺 Fake-Tcp Fake-Tcp 自己寫的一個偽裝包測試。 嘗試把UDP的包偽裝成TCP包&#xff0c;再發送到Internet Wow Fishing Script 魔獸世界釣魚腳本 自己寫的魔獸世界釣魚腳本&#xff0c;10.0初期釣魚成功率90%以上。現在關服了…

基于Spring Boot的高校圖書館管理系統的設計與實現(Java+spring boot+MySQL)

獲取源碼或者論文請私信博主 演示視頻&#xff1a; 基于Spring Boot的高校圖書館管理系統的設計與實現&#xff08;Javaspring bootMySQL&#xff09; 使用技術&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java sp…

關于ChatGPT抽樣調查:78%的人用于搜索,30%的人擔心因它失業

人工智能早已不再被視為未來科技&#xff0c;而是越來越多地應用在時下人們的生活之中。根據DECO PROTESTE的調查&#xff0c;大約72%的葡萄牙人認為人工智能已經活躍于他們的日常。[1] 隨著ChatGPT對各個行業的影響&#xff0c;也引發了人們關于這種人工智能模型潛力的爭論&a…

c++模板的原理與使用

C中實現代碼復用有兩個方式&#xff1a;類的繼承&#xff08;即實現了多態&#xff09;&#xff0c;以及模板的使用。這里介紹的模板的知識。 模板的目的&#xff1a; 同樣的代碼適用于不同類型下的使用&#xff0c;實現代碼的復用目的。 模板的原理&#xff1a; 編譯階段&am…

Cygwin 配置C/C++編譯環境以及如何編譯項目

文章目錄 一、安裝C、C編譯環境需要的包1. 選擇gcc-core、gcc-g2. 選擇gdb3. 選擇mingw64下的gcc-core、gcc-g4. 選擇make5. 選擇cmake6. 確認更改7. 查看包安裝狀態 二、C、C 項目編譯示例step1&#xff1a;解壓縮sed-4.9.tar.gzstep2&#xff1a;執行./configure生成Makefile…