本文的django view採用的是基於cbv的模式
django中的登入功能主要涉及到django.contrib.auth這個包,它提供了2個重要的函式:authenticate和login。
這個函式接受的乙個收集引數,但至少需要接受username和password這兩個關鍵引數,它完成以下的事情:
從setting中獲取authentication_backends的元組, 預設情況下是django.contrib.auth.backends.modelbackend.
遍歷這整個元組,然後呼叫每乙個backend的authenticate方法,而每個backend.authenticate會有乙個登陸邏輯(自定義後面會提及),如modelbackend.authenticate它拿傳過來的賬號密碼的與資料庫user model的username與password進行驗證。
如果backend.authenticate驗證通過,就會返回乙個user物件,然後auth.authenticate將不再進行遍歷,return user物件。如果返回none,就繼續呼叫下乙個backend.authenticate。如果全部都返回none,那麼驗證不通過。
login只會用在auth.authenticate返回乙個user的情況下,這個函式會接著做下面的事情:
生成乙個新的session_id 放到request.session中(這個session在返回時會被session的中介軟體進行處理,將session_id放入到cookie當中)
將這個user放到request.user中
講了那麼多,我們來看一下**:
class
loginview
(view):
defget
(self, request):
pass
defpost
(self, request):
username = request.post.get('username', '')
password = request.post.get('password', '')
login_form = loginform(request.post)
if login_form.is_valid:
user = auth.authenticate(username=username, password=password)
if user is
notnone:
login(request, user)
# 如果登入成功,重定向要主頁
# user為none,說明賬號或密碼錯誤
return render(request, "login.html", )
else:
# 表單無效,返回login_form物件即可,在template呼叫login_form.errors這個字典去獲取相關的錯誤
return render(request, "login.html", )
顯然,如果單純使用modelbackend.authenticate的驗證邏輯是不能滿足我們的需求,我們登入的賬號可以是username,也可以是手機/郵箱等,這時候,我們可以進行乙個自定義的登入邏輯驗證。
首先在view中寫自己的backend,最好直接繼承modelbackend
過載authenticate方法,引數直接來自auth.authenticate,但因為驗證需要用到表單中的username和password,所以前面提到,auth.authenticate也至少去接受這兩個關鍵引數
用q方法可以在進行或操作,如果用』,』是使用與操作,由於資料庫中的password是加密的,不能直接使用password=password,django為我們提供了check_password方法進行驗證。
如果驗證通過需要返回user物件,否則返回none
在setting中配置
authentication_backends = (
'users.views.myuserbackend',
)
from django.db.models import q
from django.contrib.auth.hashers import make_password
class
myuserbackend
(modelbackend):
""" 自定義使用者驗證
"""defauthenticate
(self, username=none, password=none, **kwargs):
try:
user = userprofile.objects.get(q(username=username) | q(email=username) | q(mobile=username))
if user.check_password(password):
return user
except exception as e:
return
none
順便提及一下logout函式,由於django已經為我們提供好了退出的處理,使用起來十分簡單:
class
logoutview
(view):
defget
(self, request):
logout(request)
return httpresponseredirect(reverse('index'))
logout函式主要完成:
將request.session清除
request.user = anonymoususer()將使用者設定與匿名使用者
django 自定義登入驗證邏輯
本文的django view採用的是基於cbv的模式 django中的登入功能主要涉及到django.contrib.auth這個包,它提供了2個重要的函式 authenticate和login。這個函式接受的乙個收集引數,但至少需要接受username和password這兩個關鍵引數,它完成以下的...
Django自定義登入驗證類
1.首先在views檢視函式內引入 from django.contrib.auth import authenticate from django.contrib.auth.backends import modelbackend q表示查詢條件 from django.db.models imp...
使用者登入 html 自定義登入邏輯 013
當 進 行 自 定 義 登 錄 邏 輯 時 需 要 用 到 之 前 講 解 的 userdetailsservice 和 passwordencoder。但是 spring security 要求 當 進行自定義登入邏輯時容器內必須有 passwordencoder 例項。所以不 能直接 new 物...