Python Django自定义身份验证后端不';行不通
我希望我的Django项目用他们的电子邮件而不是用户名来验证用户。我跟着,但没用 这是我的Python Django自定义身份验证后端不';行不通,python,django,Python,Django,我希望我的Django项目用他们的电子邮件而不是用户名来验证用户。我跟着,但没用 这是我的EmailBackend from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend class EmailBackend(ModelBackend): def authenticate(self, username=None, password=None,
EmailBackend
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
class EmailBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwars):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=username)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None
我已将AUTHENTICATION\u BACKENDS=['GeneralApp.utils.EmailBackend']
添加到settings.py中,当它被注释时,我可以使用用户名登录,当我取消注释它时,我无法再登录。我发现,GeneralApp.utils.EmailBackend.authenticate()
的代码从未执行过,但我知道Django可以找到该类,因为我故意拼错了该类,因此我得到了一个错误,当我纠正输入错误时,不会引发异常。我还知道默认的身份验证后端被有效覆盖,因为我无法使用用户名登录。我在另一个项目中也有同样的解决方案,因此我无法理解为什么当类完全位于authentication\u BACKENDS设置为时,自定义身份验证代码永远不会执行。我想这可能会对您有所帮助。
从helper类继承并生成自定义用户是一种更好的方法,而不是编写自己的自定义后端。好的,我以前在Django 2.0.5中尝试过这个方法,但它停止了在Django 2.1中的工作。我研究发现,定制身份验证后端类现在需要方法身份验证中的参数请求。因此,Django 2.1的最终代码是:
class EmailBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwars):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=username)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None
在Django 3.x中工作
自定义身份验证文件如下所示:
from django.contrib.auth import get_user_model
User = get_user_model()
class EmailAuthBackend(object):
"""It provides the functionality to slide down to email to login,
instead of just username"""
def authenticate(self,request,username=None,password=None):
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
return None
except User.DoesNotExist:
return None
def get_user(self,user_id):
try:
return User.objects.get(id=user_id)
except User.DoesNotExist:
return None
在settings.py中,我们需要输入:
#Custom Authentication Backend
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'user_accounts.custom_auth_backend.EmailAuthBackend',
]
您使用的是哪个版本的django?。您在使用自定义后端时是否遇到任何错误或异常?它是Djando 2.1。毫无例外