Django在做后臺系統過程中,我們通常都會為view函數添加 @login_required
裝飾器,這個裝飾器的主要作用就是在用戶訪問這個方法時,檢查用戶是否已經成功登陸,如果沒有則重定向到登陸頁面
登陸頁面地址是通過 settings.LOGIN_URL
來獲取的,默認為 /accounts/login/
頁面,當然你也可以在settings配置文件中通過添加 LOGIN_URL
配置來改掉他,同時 @login_required
也接收參數 login_url
來指定登陸頁面
1
2
3
4
|
from django.contrib.auth.decorators import login_required @login_required (login_url = '/login/' ) def home(request): return JsonResponse({data ': ' ops - coffee.cn'}) |
Middleware
通常對于一個后臺系統來說,每一個頁面都需要登陸才能訪問,這樣我們就需要給每一個view方法添加 @login_required
裝飾器,那么有沒有簡單優雅一點的方式呢?可以通過Middleware中間件來實現
中間件位于用戶請求和程序響應之間,當用戶訪問一個url之后并不是直接交給了view去處理,而是先經過中間件處理,然后再到了view,路線是這樣的:user-->middleware-->view,所以針對全局所有view的操作就非常適合放在中間件里去處理
Django的中間件都定義在settings的 MIDDLEWARE
配置下,默認就添加了諸如auth、csrf之類的中間件

需要注意的是Django的中間件是有先后順序的,對于接收到的請求默認從上到下依次執行,關于Django的中間件這里不過多介紹,查詢相關文檔即可
對于優雅處理用戶訪問view驗證登陸的需求,我們就可以通過添加自定義的中間件來處理,方法非常簡單
先來編寫中間件類,代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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__ 函數,初始化了幾個變量。需要注意的是定義了一個變量 open_urls ,這是一個list,包含所有不需要驗證登陸的頁面,提供了更強的靈活性,在這個列表里的url都不會驗證是否登陸,默認將 login_url 添加到了 open_urls 列表中
__call__ 函數會判斷當用戶沒有登陸且請求的URL不在 open_urls 列表中時,就直接給重定向到登陸頁面
代碼比較簡單,這里不做過多解釋
然后在setting配置文件的MIDDLEWARE中添加上邊這個中間件的方法就可以了
1
2
3
|
MIDDLEWARE = [ 'coffee.middleware.loginrequired.LoginRequiredMiddleware' , ] |
LoginRequiredMiddleware 中間件放在最后一行即可,前邊為中間件類的路徑, coffee 作為一個app,需要包含在 INSTALLED_APPS 內,目錄結構大概如下:
1
2
3
4
5
6
7
8
9
10
11
|
webapp - coffee - middleware - __init__.py - loginrequired.py - views.py - webapp - __init__.py - settings.py - urls.py - manage.py |
當我們有需要排除,不用檢查是否登陸的URL時,只需要在settings配置文件中添加 OPEN_URLS 配置即可
1
|
OPEN_URLS = [ '/devops/' , '/webssh/' ] |
至此,完美解決了所有view都需要添加 @login_required
的問題
中間件的合理運用,能幫助我們簡化很多操作,編寫優雅的代碼,例如記錄系統審計日志就可以通過中間件來方便的實現,試想一下,還有哪些地方可以用到呢?
總結
到此這篇關于Django全局啟用登陸驗證login_required的方法的文章就介紹到這了,更多相關django登陸驗證login_required內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:http://mp.weixin.qq.com/s?__biz=MzU5MDY1MzcyOQ==&mid=2247484380&idx=1&sn=f2f325b452b2438e1985adec813313d2