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.