问题描述
我创建了一个自定义身份验证方法,因为我想通过电子邮件登录而不是用户名,因为我已经编写了 backends.py
后端.py
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
usermodel = get_user_model()
class EmailBackend(object):
def authenticate(username=None,password=None):
try:
user = usermodel.objects.get(email=username)
if user.check_password(password):
return user
else:
return None
except usermodel.DoesNotExist:
raise ValidationError('Invalid Credentials')
def get_user(self,user_id):
try:
return usermodel.objects.get(pk=user_id)
except usermodel.DoesNotExist:
return None
登录(请求,用户,backend='django.contrib.auth.backends.ModelBackend')
views.py
from django.shortcuts import render,redirect
from users.forms import RegisterForm,LoginForm
from users.backends import EmailBackend as em
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth import login
def register(request):
if request.method=='POST':
form = RegisterForm(request.POST)
if form.is_valid():
form.save()
print('Successfully Created')
else:
form = RegisterForm()
return render(request,'users/register.html',{'form':form})
def user_login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
uname = request.POST['username']
pwd = request.POST['password']
user = em.authenticate(username=uname,password=pwd)
if user is not None:
if user.is_active==True:
k=login(request,user,backend='django.contrib.auth.backends.ModelBackend')
print(user,k)
print('Successfull login')
else:
print('Unsuccessfull login')
else:
form = LoginForm()
return render(request,'users/login.html',{'form':form})
在我的控制台中,我试图获取登录函数返回的值,但返回的是 None 。
k=login(request,backend='django.contrib.auth.backends.ModelBackend') 打印(用户,k)
在我的控制台中输出:
[16/Mar/2021 16:02:34] "POST /register/ HTTP/1.1" 200 881
[16/Mar/2021 16:02:52] "GET /login/ HTTP/1.1" 200 705
testuser@gmail.com None
Successfull login
[16/Mar/2021 16:02:58] "POST /login/ HTTP/1.1" 302 0
[16/Mar/2021 16:02:58] "GET /home HTTP/1.1" 200 237**
Print 方法给出了正确的 user 值,但对于 k,它给出了 None。这意味着登录功能无法正常工作,也意味着登录身份验证无法正常工作。
我的代码:
settings.py
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend','users.backends.EmailBackend']
models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser,AbstractUser
from django.utils.translation import gettext_lazy as _
class CustomUser(AbstractBaseUser):
email = models.EmailField(_('email address'),unique=True)
last_login = models.DateTimeField(verbose_name='last login',auto_Now=True)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(verbose_name='date joined',auto_Now_add=True)
USERNAME_FIELD='email'
forms.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm,AuthenticationForm
from django import forms
from users.models import CustomUser
class RegisterForm(UserCreationForm):
class Meta():
model = get_user_model()
fields = ('email','password1','password2')
class LoginForm(AuthenticationForm):
class Meta():
model = get_user_model()
解决方法
你登录错了。您正在引用您刚刚覆盖的身份验证后端。
在您的登录功能中,执行
login(request,user)
在您的设置中
AUTHENTICATION_BACKENDS = ['users.backends.EmailBackend','django.contrib.auth.backends.ModelBackend']
还有一件事,不要导入您的后端。如果没有自己的后端,只需像您一样导入 django 身份验证模块
并将您的身份验证行更改为
From django.contrib.auth import authenticate
user = authenticate(username=uname,password=pwd)
,
我得到答案 login 方法没有返回值,这就是它返回 None 的原因。执行身份验证方法后,如果凭据有效,它将返回一个用户。之后,登录方法将使您登录。