Невозможно войти после операции PUT Django REST Framework - PullRequest
0 голосов
/ 17 апреля 2020

У меня следующая проблема: запрос на вход возвращает «Не удается войти с предоставленными учетными данными» после выполнения запроса 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

1 Ответ

0 голосов
/ 17 апреля 2020

Решил проблему, ребята! Итак, проблема была в поле 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
...