您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了Django如何全局啟用登陸驗證login_required,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
Django在做后臺系統(tǒng)過程中,我們通常都會為view函數(shù)添加 @login_required
裝飾器,這個裝飾器的主要作用就是在用戶訪問這個方法時,檢查用戶是否已經(jīng)成功登陸,如果沒有則重定向到登陸頁面
登陸頁面地址是通過 settings.LOGIN_URL
來獲取的,默認為 /accounts/login/
頁面,當然你也可以在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)雅一點的方式呢?可以通過Middleware中間件來實現(xiàn)
中間件位于用戶請求和程序響應之間,當用戶訪問一個url之后并不是直接交給了view去處理,而是先經(jīng)過中間件處理,然后再到了view,路線是這樣的:user-->middleware-->view,所以針對全局所有view的操作就非常適合放在中間件里去處理
Django的中間件都定義在settings的 MIDDLEWARE
配置下,默認就添加了諸如auth、csrf之類的中間件
需要注意的是Django的中間件是有先后順序的,對于接收到的請求默認從上到下依次執(zhí)行,關于Django的中間件這里不過多介紹,查詢相關文檔即可
對于優(yōu)雅處理用戶訪問view驗證登陸的需求,我們就可以通過添加自定義的中間件來處理,方法非常簡單
先來編寫中間件類,代碼如下:
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,包含所有不需要驗證登陸的頁面,提供了更強的靈活性,在這個列表里的url都不會驗證是否登陸,默認將 login_url 添加到了 open_urls 列表中
__call__ 函數(shù)會判斷當用戶沒有登陸且請求的URL不在 open_urls 列表中時,就直接給重定向到登陸頁面
代碼比較簡單,這里不做過多解釋
然后在setting配置文件的MIDDLEWARE中添加上邊這個中間件的方法就可以了
MIDDLEWARE = [ 'coffee.middleware.loginrequired.LoginRequiredMiddleware', ]
LoginRequiredMiddleware 中間件放在最后一行即可,前邊為中間件類的路徑, coffee 作為一個app,需要包含在 INSTALLED_APPS 內,目錄結構大概如下:
webapp - coffee - middleware - __init__.py - loginrequired.py - views.py - webapp - __init__.py - settings.py - urls.py - manage.py
當我們有需要排除,不用檢查是否登陸的URL時,只需要在settings配置文件中添加 OPEN_URLS 配置即可
OPEN_URLS = ['/devops/', '/webssh/']
至此,完美解決了所有view都需要添加 @login_required
的問題
中間件的合理運用,能幫助我們簡化很多操作,編寫優(yōu)雅的代碼,例如記錄系統(tǒng)審計日志就可以通過中間件來方便的實現(xiàn),試想一下,還有哪些地方可以用到呢?
以上就是關于Django如何全局啟用登陸驗證login_required的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。