Python 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,

我希望我的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, **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。毫无例外