如何在Django | rest_framework_jwt中使用用户名或电子邮件登录?

如何在Django | rest_framework_jwt中使用用户名或电子邮件登录?,django,authentication,django-rest-framework,customization,Django,Authentication,Django Rest Framework,Customization,我想同时使用用户名和电子邮件登录页面,我编写了一个CustomBackend视图进行身份验证,无论我如何更改,只有用户名起作用,我使用“电子邮件”登录页面,总是出现无法使用提供的凭据登录的错误,视图的部分代码.py如下: from django.contrib.auth import get_user_model MyUser = get_user_model() class CustomBackend(object): def authenticate(self, username

我想同时使用
用户名
电子邮件
登录页面,我编写了一个
CustomBackend
视图进行身份验证,无论我如何更改,只有
用户名
起作用,我使用“电子邮件”登录页面,总是出现
无法使用提供的凭据登录的错误
,视图的部分代码.py如下:

from django.contrib.auth import get_user_model

MyUser = get_user_model()

class CustomBackend(object):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = MyUser.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user

        except MyUser.DoesNotExist:
            MyUser().set_password(password)
AUTHENTICATION_BACKENDS = (
    'general.views.CustomBackend',
    'django.contrib.auth.backends.ModelBackend'
)
settings.py的部分代码如下:

from django.contrib.auth import get_user_model

MyUser = get_user_model()

class CustomBackend(object):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = MyUser.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user

        except MyUser.DoesNotExist:
            MyUser().set_password(password)
AUTHENTICATION_BACKENDS = (
    'general.views.CustomBackend',
    'django.contrib.auth.backends.ModelBackend'
)

任何想法都将受到高度赞赏。

您需要为
用户添加自定义模型,并指定
USERNAME\u字段='email'
感谢您的快速回复,据我们所知,
USERNAME\u字段='email'
不能同时使用'USERNAME'和'email'登录,只能使用
email
,我想要两个字段你的代码看起来不错,所以你需要更详细地调试。在authenticate方法中设置断点并检查失败的位置。或者添加打印语句以了解所遵循的路径。也许您可以从这个问题的答案中获得一些帮助:您需要为
用户
添加自定义模型,并指定
用户名\u字段='email'
,感谢您的快速回复,据我所知,
USERNAME\u FIELD='email'
无法同时使用'USERNAME'和'email'登录,仅
email
,我想要两个字段您的代码看起来不错,因此您需要进行更详细的调试。在authenticate方法中设置断点并检查失败的位置。或者添加打印语句以了解所遵循的路径。也许您可以从以下问题的答案中获得一些帮助: