程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django中間件及其編寫

編輯:Python

文章目錄

      • 簡介
      • 自定義Django中間件

Django有一個功能是中間件,他可以在不改變現有代碼的情況下,對請求或者相應等附加一些額外的操作,最常用的功能比如有登陸驗證、過濾名單、日志記錄等場景。

簡介

本質上其實是一個hook鉤子,在request到來或者response通過的時候會觸發,根據相應規則進行修改。

如果看Django項目的settings.py,可以看到裡面有一向是MIDDLEWARE裡面就注冊了當前使用的一些中間件,如下所示

  • django.middleware.security.SecurityMiddleware:一些安全防護機制
  • django.middleware.common.CommonMiddleware:提供了對URL的重寫,基於APPEND_SLASH和PREPEND_WWW,前者如果為True,如果一個沒有末尾斜槓的URL沒有匹配的時候會自動加一個斜槓重新匹配;如果後者為True,如果一個沒有www.開頭的URL沒有匹配到,會自動加一個www.重新匹配
  • django.middleware.csrf.CsrfViewMiddleware:啟動CSRF防護,會自動給返回前端的網頁模板中添加一個csrf隱藏控件,value是一個隨機生成的字符串,提交表單的時候會附帶這個token給後端,後端會驗證csrf token是否合法,避免惡意偽造攻擊
  • django.contrib.sessions.middleware.SessionMiddleware:啟動session功能,在項目中可以使用session
  • django.contrib.auth.middleware.AuthenticationMiddleware:使用會話將用戶與請求關聯起來

Django中間件繼承自django.utils.deprecation.MiddlewareMixin提供了五個方法其實,至少需要實現其中一個

  • process_request(self,request):request到來路由匹配之前,正常返回None;異常返回HttpResponse
  • process_view(self,request,callback,callback_args,callback_kwargs):callback是視圖函數,後面args是位置參數,這個是路由匹配後視圖函數被調用之前觸發的,用於代碼層面的替換和過濾,這裡可以拿到視圖函數的參數,正常返回None;異常返回HttpResponse
  • process_response(self,request,response):在相應從服務器發出之前觸發,正常返回None;異常返回HttpResponse
  • process_exception(self,request,exception):出現異常的時候會被調用,異常返回HttpResponse
  • process_template_response(self,request,response):試圖函數執行完成,主要是render方法,實現了render方法的響應對象。正常返回None;異常返回HttpResponse

如果正常進入下一步的話,都是返回None的,就是不寫返回值直接return

自定義Django中間件

比如我現在的需求是需要添加我自己的一個登陸驗證功能,我其實可以通過裝飾器實現,也可以通過在代碼最前面驗證session,但是我不止一個函數需要這麼做,如果對所有函數這麼操作,會非常麻煩,中間件的作用就凸顯出來了,只需要一個中間件,他就可以管理到所有的函數方法。

首先創建一個app叫middleware,在裡面創建一個python文件login.py,在裡面創建一個類LoginMiddleware

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
import re
class LoginMiddleware(MiddlewareMixin):
count_dict = {
} #創建用於統計次數的字典
def process_request(self,request):
print('這是我的中間件')
return

然後修改settings.py文件,在修改如下,添加中間件和app

INSTALLED_APPS = [
...
'middleware'
]
MIDDLEWARE = [
...
'middleware.login.LoginMiddleware',
]

然後啟動服務即可


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved