You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework如何实现邮箱登录?验证返回None问题排查

问题原因

Django 内置的authenticate()身份校验函数默认仅识别username、password两个入参,你当前序列化器中直接将包含email、password键的字典解包传入authenticate(),函数无法识别email参数,所以返回空值。

解决方案

方案1:直接修改序列化器校验逻辑(无需修改全局配置)

手动通过邮箱查询用户,再校验密码是否匹配,修改后的序列化器代码如下:

class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField()

    def validate(self, data):
        email = data.get('email')
        password = data.get('password')
        # 按邮箱查询用户
        try:
            user = User.objects.get(email=email)
        except User.DoesNotExist:
            raise serializers.ValidationError("Incorrect Credentials")
        # 校验密码和账号状态
        if user.check_password(password) and user.is_active:
            return user
        raise serializers.ValidationError("Incorrect Credentials")

方案2:自定义全局认证后端(支持邮箱+用户名双登录方式)

如果需要全局支持邮箱作为登录凭证,可以自定义认证后端,步骤如下:

  1. 新建自定义认证类
# 可以放在你app的auth.py文件中
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

User = get_user_model()

class EmailAuthBackend(ModelBackend):
    def authenticate(self, request, email=None, password=None, **kwargs):
        # 兼容用户名登录逻辑
        if email is None:
            email = kwargs.get('username')
        try:
            user = User.objects.get(email=email)
        except User.DoesNotExist:
            return None
        # 校验密码和账号有效性
        if user.check_password(password) and self.user_can_authenticate(user):
            return user
        return None
  1. 在项目settings.py中注册认证后端
AUTHENTICATION_BACKENDS = [
    # 替换为你自定义认证类的实际路径
    'your_app_name.auth.EmailAuthBackend',
    # 保留Django默认的用户名登录能力
    'django.contrib.auth.backends.ModelBackend',
]

配置完成后你原来的序列化器代码无需修改即可正常支持邮箱登录。

注意事项

请确保你使用的用户模型中email字段配置了unique=True唯一约束,避免出现多个账号绑定同一个邮箱导致查询异常。

内容的提问来源于stack exchange,提问作者maedeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:45:04