django中有时候需要使用邮箱来登陆,而django默认是使用username来登录,解决办法是什么?
正常的登陆写法如下:
from django.views import View
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
class LoginView(View):
def post(self, request):
username = request.POST.get("username", None)
password = request.POST.get("password", None)
user = authenticate(username=username, password=password) #用户验证
if user:
login(request, user) #用户登录
return redirect('/index.html')
return render(request, "login.html")
从上述代码可以看到django登陆主要是基于authenticate,如果我们想要使用手机号码/邮箱来代替,那么可以重写authenticate()
from django.contrib.auth.backends import ModelBackend
from models import Users
class EmailBackend(ModelBackend):
def authenticate(self, request, email=None, password=None, **kwargs):
if email is None:
phone = kwargs.get('phone')
if phone is None:
return None
else:
try:
user = Users.objects.get(phone=phone)
except Users.DoesNotExist:
return None
else:
try:
user = Users.objects.get(email=email)
except Users.DoesNotExist: # 可以捕获除与程序退出sys.exit()相关之外的所有异常
return None
if user.check_password(password):
return user
def get_user(self, user_id):
try:
return Users.objects.get(id=user_id)
except Users.DoesNotExist:
return None
然后在setting.py中添加以下代码
AUTHENTICATION_BACKENDS = (
'app名字.views.CustomBackend',
)