django 使用手机号码/邮箱email代替用户名username登陆

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, username=None, password=None, **kwargs):
        try:
            user = Employee.objects.get(Q(phone=username) | Q(email=username))
        except Employee.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.EmailBackend',
)

猜你喜欢

转载自blog.csdn.net/a1007720052/article/details/81014851
今日推荐