Как изменить ответы на ошибки проверки в 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)
, а затем осуществить пользовательский обработчик исключений это определяет, как создается ответ на ошибку.