Django全局啟用登陸驗(yàn)證login_required的方法
Django在做后臺系統(tǒng)過程中,我們通常都會為view函數(shù)添加 @login_required
裝飾器,這個裝飾器的主要作用就是在用戶訪問這個方法時,檢查用戶是否已經(jīng)成功登陸,如果沒有則重定向到登陸頁面
登陸頁面地址是通過 settings.LOGIN_URL
來獲取的,默認(rèn)為 /accounts/login/
頁面,當(dāng)然你也可以在settings配置文件中通過添加 LOGIN_URL
配置來改掉他,同時 @login_required
也接收參數(shù) login_url
來指定登陸頁面
from django.contrib.auth.decorators import login_required @login_required(login_url='/login/') def home(request): return JsonResponse({data': 'ops-coffee.cn'})
Middleware
通常對于一個后臺系統(tǒng)來說,每一個頁面都需要登陸才能訪問,這樣我們就需要給每一個view方法添加 @login_required
裝飾器,那么有沒有簡單優(yōu)雅一點(diǎn)的方式呢?可以通過Middleware中間件來實(shí)現(xiàn)
中間件位于用戶請求和程序響應(yīng)之間,當(dāng)用戶訪問一個url之后并不是直接交給了view去處理,而是先經(jīng)過中間件處理,然后再到了view,路線是這樣的:user-->middleware-->view,所以針對全局所有view的操作就非常適合放在中間件里去處理
Django的中間件都定義在settings的 MIDDLEWARE
配置下,默認(rèn)就添加了諸如auth、csrf之類的中間件
需要注意的是Django的中間件是有先后順序的,對于接收到的請求默認(rèn)從上到下依次執(zhí)行,關(guān)于Django的中間件這里不過多介紹,查詢相關(guān)文檔即可
對于優(yōu)雅處理用戶訪問view驗(yàn)證登陸的需求,我們就可以通過添加自定義的中間件來處理,方法非常簡單
先來編寫中間件類,代碼如下:
from django.shortcuts import redirect from django.conf import settings class LoginRequiredMiddleware: def __init__(self, get_response): self.get_response = get_response self.login_url = settings.LOGIN_URL self.open_urls = [self.login_url] + getattr(settings, 'OPEN_URLS', []) def __call__(self, request): if not request.user.is_authenticated and request.path_info not in self.open_urls: return redirect(self.login_url + '?next=' + request.path) return self.get_response(request)
__init__ 和 __call__ 為middleware的固定格式
__init__ 函數(shù),初始化了幾個變量。需要注意的是定義了一個變量 open_urls ,這是一個list,包含所有不需要驗(yàn)證登陸的頁面,提供了更強(qiáng)的靈活性,在這個列表里的url都不會驗(yàn)證是否登陸,默認(rèn)將 login_url 添加到了 open_urls 列表中
__call__ 函數(shù)會判斷當(dāng)用戶沒有登陸且請求的URL不在 open_urls 列表中時,就直接給重定向到登陸頁面
代碼比較簡單,這里不做過多解釋
然后在setting配置文件的MIDDLEWARE中添加上邊這個中間件的方法就可以了
MIDDLEWARE = [ 'coffee.middleware.loginrequired.LoginRequiredMiddleware', ]
LoginRequiredMiddleware 中間件放在最后一行即可,前邊為中間件類的路徑, coffee 作為一個app,需要包含在 INSTALLED_APPS 內(nèi),目錄結(jié)構(gòu)大概如下:
webapp - coffee - middleware - __init__.py - loginrequired.py - views.py - webapp - __init__.py - settings.py - urls.py - manage.py
當(dāng)我們有需要排除,不用檢查是否登陸的URL時,只需要在settings配置文件中添加 OPEN_URLS 配置即可
OPEN_URLS = ['/devops/', '/webssh/']
至此,完美解決了所有view都需要添加 @login_required
的問題
中間件的合理運(yùn)用,能幫助我們簡化很多操作,編寫優(yōu)雅的代碼,例如記錄系統(tǒng)審計(jì)日志就可以通過中間件來方便的實(shí)現(xiàn),試想一下,還有哪些地方可以用到呢?
總結(jié)
到此這篇關(guān)于Django全局啟用登陸驗(yàn)證login_required的方法的文章就介紹到這了,更多相關(guān)django登陸驗(yàn)證login_required內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決python ThreadPoolExecutor 線程池中的異常捕獲問題
這篇文章主要介紹了解決python ThreadPoolExecutor 線程池中的異常捕獲問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04python numpy函數(shù)中的linspace創(chuàng)建等差數(shù)列詳解
numpy.linspace是用于創(chuàng)建一個一維數(shù)組,并且是等差數(shù)列構(gòu)成的一維數(shù)組,下面這篇文章主要給大家介紹了關(guān)于python numpy函數(shù)中的linspace創(chuàng)建等差數(shù)列的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-10-10基于Python中單例模式的幾種實(shí)現(xiàn)方式及優(yōu)化詳解
下面小編就為大家分享一篇基于Python中單例模式的幾種實(shí)現(xiàn)方式及優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Python 編碼處理-str與Unicode的區(qū)別
本文主要介紹Python 編碼處理的問題,這里整理了相關(guān)資料,并詳細(xì)說明如何處理編碼問題,有需要的小伙伴可以參考下2016-09-09ORM Django 終端打印 SQL 語句實(shí)現(xiàn)解析
這篇文章主要介紹了ORM Django 終端打印 SQL 語句實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08使用 NumPy 和 Matplotlib 繪制函數(shù)圖
Matplotlib 是 Python 的繪圖庫。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。 它也可以和圖形工具包一起使用,如 PyQt 和 wxPython2021-09-09python調(diào)用Matplotlib繪制分布點(diǎn)圖
這篇文章主要為大家詳細(xì)介紹了python調(diào)用Matplotlib繪制分布點(diǎn)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10