Django REST (DRF) - обработка ошибок в api_view
У меня есть следующее представление API и сериализатор для изменения пароля пользователя:
views.py
@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
exception_handler = UserUnavailable
success_handler = UserCreated
if request.method == 'POST':
creation_serializer = UserCreateSerializer(data=request.data)
try:
if creation_serializer.is_valid(raise_exception=True):
creation_serializer.save()
user_serializer = NewUserSerializer(instance=creation_serializer.instance)
return JsonResponse(
{"status_code": success_handler.status_code,
"default_detail": success_handler.default_detail,
"default_code": success_handler.default_code,
"new_user": user_serializer.data,
}, status=status.HTTP_201_CREATED, safe=False)
except APIException:
return Response(
{"status_code": exception_handler.status_code,
"default_detail": exception_handler.default_detail,
"default_code": exception_handler.default_code},
status=status.HTTP_400_BAD_REQUEST
)
serializers.py
class UserPasswordSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
password = serializers.CharField(max_length=128, write_only=True, required=True, validators=[validate_password])
password2 = serializers.CharField(max_length=128, required=True)
old_password = serializers.CharField(max_length=128, required=True)
class Meta:
model = get_user_model()
fields = ('user', 'password', 'password2', 'old_password')
extra_kwargs = {'password': {'write_only': True}}
def validate_old_password(self, value):
user = self.context['request'].user
if not user.check_password(value):
raise serializers.ValidationError(
({'old_password': _("Your old password was entered incorrectly. Please enter it again..")})
)
return value
def validate(self, data):
if data['password'] != data['password2']:
raise serializers.ValidationError({'password2': _("The two password fields didn't match.")})
password_validation.validate_password(data['password'])
return data
def save(self, **kwargs):
password = self.validated_data['password']
user = self.context['request'].user
user.set_password(password)
user.save()
return user
Если я обновляю пароль пользователя, я просто получаю ответ http200 и пароль был установлен, отлично! Но если я посылаю тот же запрос во второй раз, я просто получаю ответ:
{
"status": "error",
"error": "Bad Request"
}
Вообще-то я ожидал бы оказаться в блоке except APIException и получить соответствующий http-контент, но вместо этого я получаю только http400 DRF по умолчанию, почему так? Кроме того, я также ожидал бы каким-то образом получить возврат serializers.ValidationError, если таковой произойдет.
P.S. Я новичок на DRF.
Заранее спасибо
Виноват, Обратите внимание, что обработчик исключений будет вызываться только для ответов, сгенерированных поднятыми исключениями. Он не будет использоваться для любых ответов, возвращаемых непосредственно представлением, таких как ответы HTTP_400_BAD_REQUEST, которые возвращаются общими представлениями при неудачной проверке сериализатора.
смотрите также: https://www.django-rest-framework.org/api-guide/exceptions/