Как изменить ответы на ошибки проверки в DRF?

Я хочу изменить JSON, который rest_framework или django возвращает при возникновении ошибки проверки.

Я буду использовать одно из моих представлений в качестве примера, но я хочу изменить сообщения об ошибках для всех моих представлений. Итак, скажем, у меня есть это представление, предназначенное для входа пользователей, предоставления электронной почты и пароля. Если они верны, он возвращает access_token.

если я отправляю только пароль, он возвращает ошибку 400:

{"email": ["This field is required."]}

и если пароль и email не матч:

{"detail": ["Unable to log in with provided credentials."]}

то, что я хочу, было бы больше похоже:

{"errors": [{"field": "email", "message": "This field is required."}]}

{"errors": [{"non-field-error": "Unable to log in with provided credentials."}]}

теперь это мой посмотреть:

class OurLoginObtainAuthToken(APIView):
    permission_classes = (AllowAny,)
    serializer_class = serializers.AuthTokenSerializer
    model = Token

    def post(self, request):
        serializer = self.serializer_class(data=request.DATA)
        if serializer.is_valid():
            #some magic
            return Response(token)           
        return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)

Я могу получить доступ к сериализатор.ошибки и изменить их, но это выглядит как только полевые ошибки могут быть доступны таким образом, как изменить также ошибки проверки, созданные в методе проверки моего сериализатора?

Это мой сериализатор (это тот же сериализатор, что и rest_framework.authtoken.сериализаторы.AuthTokenSerializer), но отредактирован, поэтому аутентификация не требует имени пользователя, но электронной почты:

class AuthTokenSerializer(serializers.Serializer):
    email = serializers.CharField()
    password = serializers.CharField()

    def validate(self, attrs):
        email = attrs.get('email')
        password = attrs.get('password')
        #print email
        #print password
        if email and password:
            user = authenticate(email=email, password=password)

            if user:
                if not user.is_active:
                    msg = _('User account is disabled.')
                    raise ValidationError(msg)
                attrs['user'] = user
                return attrs
            else:
                msg = _('Unable to log in with provided credentials.')
                raise ValidationError(msg)
        else:
            msg = _('Must include "username" and "password"')
            raise ValidationError(msg)

или, может быть, есть совершенно другой подход? Я буду очень благодарен за любые идеи.

1 ответов


самый простой способ изменить стиль ошибки во всем представлении в вашем приложении-всегда использовать serializer.is_valid(raise_exception=True), а затем осуществить пользовательский обработчик исключений это определяет, как создается ответ на ошибку.