Django+中介軟體+登入驗證
阿新 • • 發佈:2018-11-08
Django的request請求需要首先經過中介軟體處理,再通過URL查詢到對應的views函式進行處理。在settings的MIDDLEWARE_CLASSES中
新增設定中介軟體進行啟用,大致原理如下圖所示:
在使用Django框架進行開發的過程中,遇到一個問題:要求對覺得多數頁面請求request進行使用者登入驗證,如果使用者沒有登入則跳轉回到登入頁面;
如果使用者登入了,則直接跳轉到新的連結頁面?
在django中提供了一種自定義裝飾器@login_required來實現驗證使用者登入:
1 # coding: utf-8 2 from django.shortcuts import render 3 from django.contrib.auth.decorators import login_required 4 5 @login_required 6 def home(request): 7 return render(request, 'home.html')
但是這種方式有一個不方便的地方:如果每新增一個功能需要驗證登入,就需要新增@login_required來進行裝飾。如果有大量的功能需要進行登入驗證,
工作量會增大。或者如果因為需求變化,刪除裝飾器,這種工作量會比較麻煩。
所以在學習過程中,想到使用django的中介軟體來進行登入驗證,在settings中增加引數,排除不需要登入的url,如:
1 2 3 4 |
EXCLUDE_URL
=
(
'/login/'
,
'/logout'
,
)
|
然後再建立一箇中間件模組,將此中介軟體新增到MIDDLEWARE_CLASSES中,定義process_request函式,對登入的url進行驗證:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# coding: utf-8
from
djangoMiddleware.settings
import
EXCLUDE_URL
from
django.shortcuts
import
HttpResponseRedirect
import
re
exclued_path
=
[re.
compile
(item)
for
item
in
EXCLUDE_URL]
class
MiddlewareMixin):
def
process_request(
self
, request):
url_path
=
request.path
for
each
in
exclued_path:
if
re.match(each, url_path):
return
if
request.user.is_authenticated:
return
HttpResponseRedirect(
'/logout'
)
else
:
return
|
其中的exclude_path為不需要驗證登入的url(白名單),直接return進入響應的views.fun進行處理。
Django的中介軟體是很方便的,當需要對所有的request進行相同的處理時,可以使用中介軟體進行處理,很方便。