溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django如何全局啟用登陸驗證login_required

發(fā)布時間:2020-07-20 10:23:13 來源:億速云 閱讀:360 作者:小豬 欄目:開發(fā)技術

這篇文章主要為大家展示了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如何全局啟用登陸驗證login_required

需要注意的是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的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI