如何使用Django rest_auth创建自定义登录视图?

人气:894 发布:2022-10-16 标签: python django django-rest-framework

问题描述

我正在使用django-rest-auth包创建一个带有电话号码的自定义登录。我只是在代码中使用rest_auth.views.LoginView来为令牌身份验证生成令牌。

这是我的序列化程序:

class LoginUserSerializer(serializers.Serializer):
    phone = serializers.CharField()
    password = serializers.CharField(
        style={'input_type': 'password'}, trim_whitespace=False)

    def validate(self, attrs):
        phone = attrs.get('phone')
        password = attrs.get('password')

        if phone and password:
            if User.objects.filter(phone=phone).exists():
                user = authenticate(request=self.context.get('request'),
                                    phone=phone, password=password)

            else:
                msg = {'detail': 'Phone number is not registered.',
                       'register': False}
                raise serializers.ValidationError(msg)

            if not user:
                msg = {
                    'detail': 'Unable to log in with provided credentials.', 'register': True}
                raise serializers.ValidationError(msg, code='authorization')

        else:
            msg = 'Must include "username" and "password".'
            raise serializers.ValidationError(msg, code='authorization')

        attrs['user'] = user
        return attrs

这是我的看法:

 from rest_auth.views import LoginView as RestLoginView

class Login(RestLoginView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, *args, **kwargs):
        serializer = LoginUserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        login(request, user)
        return super().post(request, format=None)

当我运行服务器时,我有这个页面,我不想有用户名和电子邮件字段。我想要电话号码,而不是这些。我如何解决这个问题?

推荐答案

在settings.py中,我忘记添加:

REST_AUTH_SERIALIZERS = {
    'LOGIN_SERIALIZER': 'Accounts.serializers.LoginUserSerializer',
}

567