Django之中間件與CSRF_TOKEN

文章目錄

  • 一、什么是中間件
  • 二、中間件有什么用
  • 三、Django自定義中間件
    • 中間件中主要方法及作用
    • `創建自定義中間件的步驟:`
    • process_request與process_response方法
    • process_view方法
    • process_exception
    • process_template_response(不常用)
  • 四、CSRF_TOKEN

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

一、什么是中間件

Django中間件類似于django的門戶,所有的請求來和響應走走必須經過中間件

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

Django官方中間件的定義:

	Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.

中間件它的執行位置在web服務網關接口之后,在路由匹配之前執行的

二、中間件有什么用

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

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

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

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

1.django.middleware.security.SecurityMiddleware

做了一些安全處理的中間件。比如設置XSS防御的請求頭,比如做了http協議轉為https協議的工作等。

2.django.contrib.sessions.middleware.SessionMiddleware

session中間件。會給request添加一個處理好的session對象。

3.django.middleware.common.CommonMiddleware

通用中間件,會處理一些URL,比如baidu.com會自動的處理成www.baidu.com。

4.django.middleware.csrf.CsrfViewMiddleware

保護中間件,在提交表單的時候必須加入csrf_token,cookie中也會生成一個名叫csrftoken的值,也會在header中加入一個HTTP_X_CSRFTOKEN的值來放置CSRF攻擊。SessionMiddleware必須出現在CsrfMiddleware之前。

5.django.contrib.auth.middleware.AuthenticationMiddleware

用戶授權中間件。會給reqeust添加一個user對象的中間件。該中間件必須在sessionmiddleware后面。

6.django.contrib.messages.middleware.MessageMiddleware

消息處理中間件。為了在多個模版中可以使用我們返回給模版的變量,并且簡化操作。

7.django.middleware.clickjacking.XFrameOptionsMiddleware

防止通過瀏覽器頁面跨Frame出現clickjacking(欺騙點擊)攻擊出現。

中間件的執行順序
在這里插入圖片描述

每一個中間件在請求來的時候或者響應的時候都具有一定的作用。


三、Django自定義中間件

Django給我們提供了創建自定義中間件的方式,通過創建自定義中間件來實現全局的功能,例如全局用戶黑名單校驗、全局用戶訪問頻率校驗、網站全局用戶身份校驗等等。

中間件中主要方法及作用

	'中間件類必須繼承自django.utils.deprecation.MiddlewareMixin類'process_request(self,request)用途:過濾請求'''1.請求來的時候會按照配置文件中注冊了的中間件,從上往下依次執行每一個中間件里面的porcess_request方法,如果沒有則直接跳過2.該方法如果返回了HttpResponse對象,那么請求不會再往后執行,原路返回'''process_view(self, request, callback, callback_args, callback_kwargs)用途:用于代碼層面的替換和過濾,這個方法可以拿到視圖函數的參數'''當路由匹配成功之后,執行視圖函數之前,自動觸發'''process_template_response(self,request,response)'''當視圖函數返回的數據對象中含有render屬性對應render函數才會觸發'''process_exception(self, request, exception)用途:用于一般用于捕獲發生的異常,并將其郵件發送給開發人員'''當視圖函數報錯之后,自動觸發'''process_response(self, request, response)'''1.響應走的時候會按照配置文件中注冊了的中間件,從下往上依次執行每一個中間件里面的process_response方法,如果沒有則直接跳過2.該方法有兩個形參request和response,并且默認情況下應該返回response3.該方法也可以自己返回HttpResponse對象,相當于貍貓換太子'''
'如果請求的過程中process_request方法直接返回了HttpResponse對象那么會原地執行同級別process_response返回后直接返回(flask則不同)'

創建自定義中間件的步驟:

	1.在項目名下或者任意的應用名下創建一個文件夾2.在該文件夾內創建一個任意名稱的py文件3.在該py文件中編寫一個自定義的中間件類,并且必須繼承MiddlewareMixin4.緊接著去settings配置文件中注冊中間件

process_request與process_response方法

當用戶發起請求的時候會依次執行經過的所有中間件,這個時候的請求首先進入process_request,最后到達views的函數中,views函數處理后,在依次穿過中間件,這個時候是process_response,最后返回給請求者。

我們要自己定義中間件的話,需要寫一個類,并且繼承MiddlewareMixin

	from django.utils.deprecation import MiddlewareMixin

第一步:需要建立一個py文件夾來編寫我們自定義的中間件,建議在應用層下面創建。
app-------》Middleware-----》middle.py

	from django.utils.deprecation import MiddlewareMixinclass MyMiddleware1(MiddlewareMixin):def process_request(self,request):print('這是第一個中間件的process_request')def process_response(self,request,response):  # 響應print('這是第一個中間件的process_response')return responseclass MyMiddleware2(MiddlewareMixin):def process_request(self,request):print('這是第二個中間件的process_request')def process_response(self,request,response):  # 響應print('這是第二個中間件的process_response')return response

第二步:在settings.py文件里面加入我們自定義的中間件

	MIDDLEWARE = [# settings這個列表中存儲的其實就是一個個中間件的路徑'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',#下面兩個就是自定義的中間件路徑地址'app.Middleware.middle.MyMiddleware1','app.Middleware.middle.MyMiddleware2',]

第三步:定義視圖函數

	'記得別忘記配置路由'def func(request):print('from func')return HttpResponse('from func')

當我們瀏覽器朝服務端發送請求,必定會經過我們剛才定義的中間件
在這里插入圖片描述

process_request方法的request則是請求,response則是視圖函數返回的內容到了中間件里面,然后由中間件return出去。所以我們是可以在process_response里面不寫return視圖函數返回的內容,自己定義內容返回。


從下圖看,正常的情況下按照綠色的路線進行執行,假設中間件1有返回值,則按照紅色的路線走,直接執行該類下的process_response方法返回,后面的其他中間件就不會執行。
在這里插入圖片描述

也就是說中間件的process_request方法使用了return,那么其后面的中間件將不再執行,直接執行該中間件和其上面中間件的process_response方法,最終將某個process_request里面的return值返回給請求者。

由此總結:

  • 中間件的process_request方法是在執行視圖函數之前執行的。
  • 當配置多個中間件時,會按照MIDDLEWARE中的注冊順序,也就是列表的索引值,從前到后依次執行的。
  • 不同中間件之間傳遞的request都是同一個對象

多個中間件中的process_response方法是按照MIDDLEWARE中的注冊順序倒序執行的,也就是說第一個中間件的process_request方法首先執行,而它的process_response方法最后執行,最后一個中間件的process_request方法最后一個執行,它的process_response方法是最先執行的。


process_view方法

該方法格式:process_view(request, view_func, view_args, view_kwargs)

process_view方法的四個參數:

  • request:HTTPRequest對象
  • view_func:Django即將調用的視圖函數
  • view_args:將傳遞給視圖的位置參數的元組
  • view_kwargs:是將傳遞給視圖的關鍵字參數的字典

view_args和view_kwargs都不包含第一個視圖函數(request)

process_view方法是在視圖函數之前,process_request方法之后執行的。

它應該返回None或一個HttpResponse對象,如果返回None,Django將繼續處理這個請求,執行任何其他中間件的process_view方法,然后在執行相應的視圖。如果它返回一個HttpResponse對象,Django不會調用適當的視圖函數。它將執行中間件的process_response方法并將應用到該HttpResponse并返回結果。

自定義中間件:

	記得需要注冊自定義中間件from django.utils.deprecation import MiddlewareMixinclass Md1(MiddlewareMixin):def process_request(self,request):print('M1請求來時,校驗')def process_response(self,reqeust,response):print('M1返回數據時,對數據進行處理')return responsedef process_view(self,request,view_func,view_args,view_kwargs):print('我在只給你view函數前執行!')class Md2(MiddlewareMixin):def process_reqeust(self,request):print('M2請求來時,校驗')def process_response(self,request,response):print('M2返回數據時,對數據進行處理')return responsedef process_view(self,request,view_func,view_args,view_kwargs):pass執行結果》》》》:M1請求來時,校驗我在只給你view函數前執行!from funcM2返回數據時,對數據進行處理M1返回數據時,對數據進行處理

下圖分析上面代碼的執行過程:
在這里插入圖片描述

當最后一個中間件的process_reqeust到達路由關系映射之后,返回到中間件1的process_view,然后依次往下,到達views函數,最后通過process_response依次返回到達用戶。

注意:process_view如果有返回值,會越過其他的process_view以及視圖函數,但是所有的process_response都還會執行。


process_exception

process_exception(self, request, exception)

該方法兩個參數:

  • 一個HttpRequest對象
  • 一個exception是視圖函數異常產生的Exception對象。

這個方法只有在視圖函數中出現異常了才執行,它返回的值可以是一個None也可以是一個HttpResponse對象。如果是HttpResponse對象,Django將調用模板和中間件中的process_response方法,并返回給瀏覽器,否則將默認處理異常。如果返回一個None,則交給下一個中間件的process_exception方法來處理異常。它的執行順序也是按照中間件注冊順序的倒序執行。

視圖函數制造錯誤

	def index(request):print('index視圖函數執行了')lis = [1,2,3]lis[4]

自定義中間件:

	class Md1(MiddlewareMixin):def process_request(self,request):print("Md1請求")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("md1 process_view...")def process_exception(self,request,exception):print("md1 process_exception...")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2請求")def process_response(self,request,response):print("Md2返回")print(response.content)return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("md2 process_view...")def process_exception(self, request, exception):print("md2 process_exception...")return HttpResponse(exception)執行結果》》》》:Md1請求Md2請求md1 process_view...md2 process_view...index視圖函數執行了md2 process_exception...Md2返回b'list index out of range'Md1返回

當process_exception進行return HttpResponse后,process_response方法就會拿到其返回的數據。

當views出現錯誤時流程圖如下:
在這里插入圖片描述

process_template_response(不常用)

該方法對視圖函數返回值有要求,必須是一個含有render方法類的對象,才會執行此方法。

process_template_response 函數是在視圖函數執行完后立即執行的

視圖

	def index(request):print("這里是 index 頁面")repsponse = HttpResponse("這里是主頁面 index")def render():print("這里是 index 函數里的 render 方法")return HttpResponse("index")repsponse.render = renderreturn repsponse

自定義中間件

	class Md2(MiddlewareMixin):def process_request(self,request):print("Md2請求")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print(view_func)print("md2 process_view...")def process_template_response(self, request, response):print("視圖函數執行完畢,且返回了render")return response執行結果》》》》:Md2請求md2 process_view...這里是 index 頁面視圖函數執行完畢,且返回了render這里是 index 函數里的 render 方法Md2返回

四、CSRF_TOKEN

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

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

相關文章

mysql latin-1報錯解決

conn pymysql.connect(hostmeta_conf[host], usermeta_conf[user], passwordmeta_conf[password], portmeta_conf[port], charsetutf8) 光把表聲明 ENGINEINNODB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin ROW_FORMATDYNAMIC 并不能解決這個報錯,需要在創建mysql連接時候…

面試:RabbitMQ相關問題

文章目錄 簡單介紹RabbitMQRabbitMQ架構什么是 RabbitMQ?有什么顯著的特點?RabbitMQ 有那些基本概念?RabbitMQ routing 路由模式消息怎么路由?RabbitMQ publish/subscribe 發布訂閱(共享資源)能夠在地理上分開的不同數據中心使用 …

vue2指令的使用和自定義指令

前言 個人認為vue的指令,對比react來說,給開發者節省了很大的學習成本。比如在react中,你想渲染一個列表,需要用Array.map的方法return<div>,而在vue中,一個簡單的v-for就解決了問題。 在學習成本和入手體驗上,vue的作者確實后來者居上,能讓人更快的使用vue開發。不過也…

無邊界電視點播TVbox殼+源

TBBox可以是個盒子也可以是軟件 視頻播放的困局新的改變TVBox apk更成熟的熊貓寶盒_3.10還有這個沒測試恒星TV 寫在最后 視頻播放的困局 現在電視上幾大平臺看劇集都要充會員&#xff0c;而電腦上網頁端有很多可以看的網頁&#xff0c;只有 隨便一搜就測出來&#xff0c;只是經…

數據安全第一:應對[[MyFile@waifu.club]].wis勒索病毒的實用建議與技巧

引言&#xff1a; 在當今數字化時代&#xff0c;[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis勒索病毒是一種惡意軟件&#xff0c;其危害用戶數據安全&#xff0c;通過加密文件并勒索贖金來獲取經濟利益。以下是對[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis…

PyTorch包

進入PyTorch的官網&#xff1a; pytorch GitHub 點擊GitHub&#xff1a; 進入PyTorch的主目錄&#xff1a; 進入Vision reference&#xff1a; detection&#xff1a; 這就是我們在訓練過程中會使用到的文件了&#xff1a;

objdump反匯編文件解析

命令使用 objdump可以對可執行文件進行反匯編 其常用參數為: objdump -d <file(s)>: 將代碼段反匯編&#xff1b;objdump -S <file(s)>: 將代碼段反匯編的同時&#xff0c;將反匯編代碼與源代碼交替顯示&#xff0c;編譯時需要使用-g參數&#xff0c;即需要調試信…

Hadoop技術與應用的習題

第一章測驗 1、下面哪個選項不屬于Google的三駕馬車&#xff1f; A.HDFS B.MapReduce C.BigTable D.GFS 2、下面哪個思想是為了解決PageRank&#xff08;網頁排名&#xff09;的問題&#xff1f; A.GFS B.BigTable C.MapReduce D.YARN 3、GFS 存儲的文件都被分割成固定大小的…

CAN基礎知識

CAN 簡介 CAN 是 Controller Area Network 的縮寫&#xff08;以下稱為 CAN&#xff09;&#xff0c;是 ISO 國際標準化的串行通信 協議。在當前的汽車產業中&#xff0c;出于對安全性、舒適性、方便性、低公害、低成本的要求&#xff0c;各種 各樣的電子控制系統被開發了出來…

簡單的用Python采集股票數據,保存表格后分析歷史數據

前言 字節跳動如果上市&#xff0c;那么鐘老板將成為我國第一個世界首富 趁著現在還沒上市&#xff0c;咱們提前學習一下用Python分析股票歷史數據&#xff0c;抱住粗大腿坐等起飛~ 好了話不多說&#xff0c;我們直接開始正文 準備工作 環境使用 Python 3.10 解釋器Pychar…

如何應用ChatGPT撰寫、修改論文及工作報告,提供寫作能力及優化工作??

如果我想讓gpt從pdf文檔中提取相關關鍵詞的內容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我們評論區討論 ChatGPT 在論文寫作與編程方面也具備強大的能力。無論是進行代碼生成、錯誤調試還是解決編程難題&#xff0c;ChatGPT都能為您提供實用且高質量的建議和指導&am…

愛上C語言:scanf、gets以及getchar輸入字符串你真的懂了嗎

&#x1f680; 作者&#xff1a;阿輝不一般 &#x1f680; 你說呢&#xff1a;不服輸的你&#xff0c;他們拿什么贏 &#x1f680; 專欄&#xff1a;愛上C語言 &#x1f680;作圖工具&#xff1a;draw.io(免費開源的作圖網站) 如果覺得文章對你有幫助的話&#xff0c;還請點贊…

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

spring 是如何開啟事務的, 核心原理是什么

文章目錄 spring 是如何開啟事務的核心原理1 基于注解開啟事務2 基于代碼來開啟事務 spring 是如何開啟事務的 核心原理 Spring事務管理的實現有許多細節&#xff0c;如果對整個接口框架有個大體了解會非常有利于我們理解事務&#xff0c;下面通過講解Spring的事務接口來了解…

建行廣東省江門市分行走進農村地區開展反假貨幣宣傳

人民對美好生活的向往&#xff0c;涉及方方面面&#xff0c;小至“錢袋子”安全。建行廣東省江門市分行落實當地監管部門部署&#xff0c;積極扛起維護國家金融安全的重要政治責任&#xff0c;深入農村地區開展反假貨幣宣傳工作&#xff0c;助力構建農村反假貨幣工作長效機制。…

Hyper-V系列:windows11開啟系統自帶安卓虛擬機并安裝apk包

本文記錄了Windows11系統下開啟系統自帶的安卓虛擬機,并通過安裝包安裝自定義應用的過程。開啟系統自帶的安卓虛擬機流程為:開啟Hyper-V、安裝Windows11子系統;安裝apk安裝包的流程為:安裝adb調試工具、開啟子系統的開發者模式、安裝apk應用包。 一. 開啟Hyper-V Hyper-V…

[BJDCTF2020]The mystery of ip1

提示 ssti模板注入head頭x-forwarded-for 每一次做題的最開始流程都大致因該是 信息收集找可以操控的地方 查看hint頁面的源代碼又發現它提示說 ####你知道為什么會知道你的ip嗎 查看flag頁面 從剛才給我的提示以及他這里顯示的我的ip&#xff0c;大概找到了我可操作的可控點 …

【Vue】創建第一個實例

步驟&#xff1a; 1.創建容器 2.引包 3.創建實例 4.添加配置項 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--準備容器 --> <di…

【C語言:深入理解指針二】

文章目錄 1. 二級指針2. 指針數組3. 字符指針變量4. 數組指針變量5. 二維數組傳參的本質6. 函數指針變量7. 函數指針數組8. 轉移表9. 回調函數10. qsort函數的使用與模擬實現 1. 二級指針 我們知道&#xff0c;指針變量也是變量&#xff0c;它也有自己的地址&#xff0c;使用什…

【面試】jvm中堆是分配對象存儲的唯一選擇嗎

目錄 一、說明二、逃逸分析2.1 說明2.2 參數設置 一、說明 1.在《深入理解Java虛擬機》中關于Java堆內存有這樣一段描述:隨著JIT編譯期的發展與逃逸分析技術逐漸成熟&#xff0c;棧上分配、標量替換優化技術將會導致一些微妙的變化&#xff0c;所有的對象都分配到堆上也漸漸變得…