PUT操作Django REST Framework之后无法登录

问题描述 投票:0回答:1

我遇到以下问题:即使数据库中的用户名和密码正确,我执行PUT请求(更改字段,例如first_name,last_name,address)后,登录请求也会返回“无法使用提供的凭据登录”。

以下用于发出登录请求的视图。

class RetrieveAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data,
                                           context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        resp = Response({
            'token': token.key,
            'user_id': user.pk,
            'email': user.email,
            'role': user.role,
        })
        return resp

这些是给我的用户和用户注册的:

from users.models import User
from users.serializers import UserSerializer, RegistrationSerializer
from rest_framework import viewsets, generics
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response

# Create your views here.


class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()


class RegistrationView(generics.CreateAPIView):
    model = User
    serializer_class = RegistrationSerializer

我的序列化器看起来像这样:

from rest_framework import serializers, status
from users.models import User


class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'})

    class Meta:
        model = User
        fields = '__all__'
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = super(UserSerializer, self).create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    def update(self, instance, validated_data):
        instance = super(UserSerializer, self).update(instance, validated_data)
        instance.set_password(validated_data['password'])
        instance.save()
        return instance


class RegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'}, write_only=True)

    def create(self, validated_data):
        user = super(RegistrationSerializer, self).create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

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

看来问题出在序列化器上:enter image description here

django django-rest-framework
1个回答
0
投票
解决了问题伙计们!因此,问题出在User的is_active字段中。在我从序列化程序执行的更新方法上,在执行该请求后,该字段设置为False。为了解决这个问题,在我的更新方法上,我将is_active字段设置为True。

def update(self, instance, validated_data): instance = super(UserSerializer, self).update(instance, validated_data) instance.set_password(validated_data['password']) instance.is_active = True instance.save() return instance

© www.soinside.com 2019 - 2024. All rights reserved.