#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':'密码不能为空',})