AssertionError, когда сериализатор не находит объект в Django Login

Я создаю приложение на django с пользовательской регистрацией и входом, которые ведут себя как формы, но когда я вхожу в систему с неправильными учетными данными, программа возвращает ошибку AssertionError. .

views.py

...
def post(self, request):

    serializer = LoginSerializer(data=request.data)
    if serializer.is_valid():

    email = serializer.validated_data['email']
    password = serializer.validated_data['password']

    user = authenticate(email=email, password=password)

    if user:
            
        login(request, user)

        return redirect('/')

    else:

        return Response({'erro': 'user nao encontrado'})

serializers.py

class LoginSerializer(serializers.ModelSerializer):

    email = serializers.EmailField(required=True)
    password = serializers.CharField(write_only=True,
        style={'input_type': 'password'})

    class Meta:

        model = Profile
        fields = ['email', 'password']

    def validate(self, attrs):

        email = attrs.get('email')
        password = attrs.get('password')

        if email and password:

            user = authenticate(email=email,
                password=password)

            if not user:

                raise serializers.ValidationError('O usuário não existe')


        attrs['user'] = user

        return attrs

Ошибка, о которой идет речь:

AssertionError at /accounts/login/
Expected a `Response`, `HttpResponse` or `StreamingHttpResponse` to be returned from the view, but received a `<class 'NoneType'>`

Я уже пробовал попытки и исключения, а также добавление Response, если пользователь не существует, но все равно ничего не помогает.

Думаю, вам нужно исправить отступы

def post(self, request):

    serializer = LoginSerializer(data=request.data)
    if serializer.is_valid():

        email = serializer.validated_data['email']
        password = serializer.validated_data['password']

        user = authenticate(email=email, password=password)

        if user:
        
            login(request, user)

            return redirect('/')

        else:

            return Response({'erro': 'user nao encontrado'})

Вид должен всегда возвращать ответ. В вашем случае есть один случай, когда ваше представление не возвращает ничего (None).

Это когда сериализатор не валиден. Я предполагаю, что в вашем коде все хорошо с отступами и вы просто допустили ошибку на StackOverflow.

def post(self, request):
    serializer = LoginSerializer(data=request.data)
    if serializer.is_valid():

        email = serializer.validated_data['email']
        password = serializer.validated_data['password']

        user = authenticate(email=email, password=password)

        if user:
        
            login(request, user)

            return redirect('/')

        else:

            return Response({'erro': 'user nao encontrado'})
    # When serializer.is_valid() return False, we are here, and the view ends by returning None. Django immediately raise an Assertion Error. You must add a else close here.
    else:
        # Return a response here.

Вернуться на верх