#settings.py
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
Django默認的驗證方法(不需要註明),這種方法一般只適用於用戶名和密碼登陸
如果自己想要使用戶可以以用戶名、密碼組合登陸也可以用郵箱、密碼登陸則需要自定義用戶的驗證函數
#views.py
from django.db.models import Q
from django.contrib.auth.backends import ModelBackend
#自定義用戶驗證函數,實現郵箱或用戶名都能登陸
class MyBackend(ModelBackend):
def authenticate(self,username=None,password=None,**kwargs):
try:
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
對應的settings.py需改寫爲:
#settings.py
AUTHENTICATION_BACKENDS = ('app.views.MyBackend',)
處理函數爲:
#views.py
from django.views.generic.base import View
from django.contrib.auth import authenticate,login
from .forms import LoginForm
from django.shortcuts import render
from django.http import HttpResponseRedirect
class LoginView(View):
def get(self,request):
return render(request, 'login.html')
def post(self,request):
login_form = LoginForm(request.POST)
if login_form.is_valid():
user_name = request.POST.get('username','')
password = request.POST.get('password','')
#與數據庫中的用戶進行比對
#上面已經地authenticate進行了重寫 若成功則返回user
user = authenticate(request,username=user_name,password=password)
if user is not None:
if user.is_active:
login(request, user)
return HttpResponseRedirect(reverse('main'))
return render(request, 'login.html', {'msg': '用戶名或密碼錯誤!'})
else:
print(login_form.errors)
return render(request,'login.html',{'msg':'用戶名或密碼錯誤!'})
在和models.py相同的目錄中新建forms.py用來設置登陸用到的表單
# -*- coding:utf-8 -*-
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(required=True,error_messages={'required':'用戶名不能爲空',})
password = forms.CharField(required=True,error_messages={'required':'密碼不能爲空',})