您好,登錄后才能下訂單哦!
這篇文章主要介紹“Django中間件的應用場景是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Django中間件的應用場景是什么”文章能幫助大家解決問題。
在之前的文章中,我們已經實現了用戶必須登錄才能投票的限制。然而,如果我們的應用中有很多功能都需要用戶先登錄才能執行,例如將前面導出Excel報表和查看統計圖表的功能都做了必須登錄才能訪問的限制,那么我們是不是需要在每個視圖函數中添加代碼來檢查session中是否包含userid
的代碼呢?答案是否定的,如果這樣做了,我們的視圖函數中必然會充斥著大量的重復代碼。編程大師 Martin Fowler 曾經說過:代碼有很多種壞味道,重復是最壞的一種。在 Python 程序中,我們可以通過裝飾器來為函數提供額外的能力;在 Django 項目中,我們可以把類似于驗證用戶是否登錄這樣的重復性代碼放到 中間件 中。
中間件是安插在 Web 應用請求和響應過程之間的組件,它在整個 Web 應用中扮演了攔截過濾器的角色,通過中間件可以攔截請求和響應,并對請求和響應進行過濾(簡單的說就是執行額外的處理)。通常,一個中間件組件只專注于完成一件特定的事,例如:Django 框架通過 SessionMiddleware
中間件實現了對 session 的支持,又通過 AuthenticationMiddleware
中間件實現了基于 session 的請求認證。通過把多個中間件組合在一起,我們可以完成更為復雜的任務,Django 框架就是這么做的。
在 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', ]
我們稍微為大家解釋一下這些中間件的作用:
CommonMiddleware
- 基礎設置中間件,可以處理以下一些配置參數。
DISALLOWED_USER_AGENTS
- 不被允許的用戶代理(瀏覽器)
APPEND_SLASH
- 是否追加/
USE_ETAG
- 瀏覽器緩存相關
SecurityMiddleware
- 安全相關中間件,可以處理和安全相關的配置項。
SECURE_HSTS_SECONDS
- 強制使用 HTTPS 的時間
SECURE_HSTS_INCLUDE_SUBDOMAINS
- HTTPS 是否覆蓋子域名
SECURE_CONTENT_TYPE_NOSNIFF
- 是否允許瀏覽器推斷內容類型
SECURE_BROWSER_XSS_FILTER
- 是否啟用跨站腳本攻擊過濾器
SECURE_SSL_REDIRECT
- 是否重定向到 HTTPS 連接
SECURE_REDIRECT_EXEMPT
- 免除重定向到 HTTPS
SessionMiddleware
- 會話中間件。
CsrfViewMiddleware
- 通過生成令牌,防范跨請求份偽的造中間件。
XFrameOptionsMiddleware
- 通過設置請求頭參數,防范點擊劫持攻擊的中間件。
在請求的過程中,上面的中間件會按照書寫的順序從上到下執行,然后是 URL 解析,最后請求才會來到視圖函數;在響應的過程中,上面的中間件會按照書寫的順序從下到上執行,與請求時中間件執行的順序正好相反。
Django 中的中間件有兩種實現方式:基于類的實現方式和基于函數的實現方式,后者更接近于裝飾器的寫法。裝飾器實際上是代理模式的應用,將橫切關注功能(與正常業務邏輯沒有必然聯系的功能,例如:身份認證、日志記錄、編碼轉換之類的功能)置于代理中,由代理對象來完成被代理對象的行為并添加額外的功能。中間件對用戶請求和響應進行攔截過濾并增加額外的處理,在這一點上它跟裝飾器是完全一致的,所以基于函數的寫法來實現中間件就跟裝飾器的寫法幾乎一模一樣。
下面我們用自定義的中間件來實現用戶登錄驗證的功能。
我們可以自定義中間件來實現對登錄狀態的檢查,如果用戶未登錄的話,就直接跳轉到登錄頁面。下面是一個簡單的中間件,用于檢查用戶是否登錄:
""" middlewares.py """ from django.http import JsonResponse from django.shortcuts import redirect # 需要登錄才能訪問的資源路徑 LOGIN_REQUIRED_URLS = {'/praise/', '/criticize/', '/excel/', '/teachers_data/'} def check_login_middleware(get_resp): def wrapper(request, *args, **kwargs): # 請求的資源路徑在上面的集合中 if request.path in LOGIN_REQUIRED_URLS: # 會話中包含 userid 則視為已經登錄 if 'userid' in request.session: return get_resp(request, *args, **kwargs) # 跳轉到登錄頁面 else: return redirect('/login/') return get_resp(request, *args, **kwargs) return wrapper
然后,在項目的配置文件中,將中間件添加到 MIDDLEWARE
列表中即可:
MIDDLEWARE = [ # ... 'path.to.check_login_middleware', # ... ]
這樣,我們就可以在需要登錄才能訪問的視圖函數中添加一個裝飾器,例如:
@check_login_middleware def praise(request): pass
這樣就完成了對登錄狀態的檢查。
關于“Django中間件的應用場景是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。