本文的django view採用的是基於cbv的模式html
django中的登陸功能主要涉及到django.contrib.auth這個包,它提供了2個重要的函數:authenticate和login。數據庫
這個函數接受的一個收集參數,但至少須要接受username和password這兩個關鍵參數,它完成如下的事情:django
login只會用在auth.authenticate返回一個user的狀況下,這個函數會接着作下面的事情:bash
講了那麼多,咱們來看一下代碼:cookie
class LoginView(View):
def get(self, request):
pass
def post(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 not None:
login(request, user)
# 若是登入成功,重定向要主頁
return HttpResponseRedirect(reverse('index'))
else:
# user爲None,說明帳號或密碼錯誤
return render(request, "login.html", {"msg": "用戶名或密碼錯誤"})
else:
# 表單無效,返回login_form對象便可,在template調用login_form.errors這個字典去獲取相關的錯誤
return render(request, "login.html", {"login_form": login_form})
複製代碼
顯然,若是單純使用ModelBackend.authenticate的驗證邏輯是不能知足咱們的需求,咱們登陸的帳號能夠是username,也能夠是手機/郵箱等,這時候,咱們能夠進行一個自定義的登陸邏輯驗證。session
# app+views+backend名字
AUTHENTICATION_BACKENDS = (
'users.views.MyUserBackend',
)
複製代碼
from django.db.models import Q
from django.contrib.auth.hashers import make_password
class MyUserBackend(ModelBackend):
""" 自定義用戶驗證 """
def authenticate(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已經爲咱們提供好了退出的處理,使用起來十分簡單:app
class LogoutView(View):
def get(self, request):
logout(request)
return HttpResponseRedirect(reverse('index'))
複製代碼
logout函數主要完成:函數