引入
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 方法