【问题标题】:TypeError: validate_email() missing 1 required positional argument: 'password'类型错误:validate_email() 缺少 1 个必需的位置参数:“密码”
【发布时间】:2020-11-25 07:24:27
【问题描述】:

我正在尝试覆盖 rest_auth 的默认 LoginSerializer,当我尝试登录时,它会抛出此错误。 这是我的代码:

settings.py

REST_AUTH_SERIALIZERS = {
    'LOGIN_SERIALIZER': 'Customer.apis.serializers.LoginSerializer',
}

和登录序列化器

class LoginSerializer(serializers.ModelSerializer):

    email = serializers.EmailField(write_only=True)
    password = serializers.CharField(write_only=True)

    class Meta:
        model = Customer
        fields = ['email', 'password']

    def validate_email(self, email, password):
        user = None
        if email and password:
            user = authenticate(email=email,
                                password=password)
        else:
            raise exceptions.ValidationError('Invalid Credentials')
        return user

    def validate(self, attrs):
        email = attrs.get('email')
        password = attrs.get('password')
        user = self.validate_email(email, password)
        attrs['user'] = user
        return attrs

可能是什么错误?以及可能的解决方法?

【问题讨论】:

  • validate_email 方法只接受 1 个参数,而不接受 2 个。

标签: django django-models django-rest-framework django-authentication django-rest-auth


【解决方案1】:

好吧,如果您将方法命名为validate_<field_name>,那么它将在该字段的表单验证期间(根据documentation)被调用,并且只有一个参数将通过该方法,即那个领域。因此,您需要将其重命名为其他名称。例如:

def verify_credentials(self, email, password):
    user = None
    if email and password:
        user = authenticate(email=email,
                            password=password)
    else:
        raise exceptions.ValidationError('Invalid Credentials')
    return user

def validate(self, attrs):
    email = attrs.get('email')
    password = attrs.get('password')
    user = self.verify_credentials(email, password)
    attrs['user'] = user
    return attrs

【讨论】:

  • 谢谢你,我遇到了另一个问题。在将其更改为 validate_credentials 时,我收到 NOT NULL 约束失败:authtoken_token.user_id 错误。这次会出什么问题?
  • 您需要为此添加完整的错误堆栈跟踪。如果您提出一个新问题会更好,因为不幸的是,这超出了当前问题的范围。我还将建议在新问题中添加更多与该错误相关的代码。 :)
猜你喜欢
  • 2019-09-09
  • 1970-01-01
  • 2018-04-04
  • 2022-01-11
  • 1970-01-01
  • 2018-09-12
  • 2021-08-05
  • 2021-07-06
相关资源
最近更新 更多