Формат ValidationError в сериализаторе

DjangoRestFramework, кажется, обрабатывает ошибки различными способами. ValidationError в классе сериализатора не всегда возвращает JSON одинаково.

Текущий ответ включает строку списка/объекта JSON:

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

Стремление достичь:

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

Я понимаю, что этот ответ является результатом функций по умолчанию. Однако я переопределил функцию проверки:

class AuthCustomTokenSerializer(serializers.Serializer):
username = serializers.CharField(write_only=True)
password = serializers.CharField(write_only=True)
token = serializers.CharField(read_only=True)

def validate(self, validated_data):
    username = validated_data.get('username')
    password = validated_data.get('password')

    # raise serializers.ValidationError({'detail': 'Unable to log in with provided credentials.'})

    if username and password:
        user = authenticate(phone_number=username, password=password)

        try:

            if UserInfo.objects.get(phone_number=username):
                userinfo = UserInfo.objects.get(phone_number=username)
                user = User.objects.filter(user=userinfo.user, password=password).latest('date_joined')

            if user:

                if user.is_active:
                    validated_data['user'] = user
                    return validated_data

                else:
                    raise serializers.ValidationError({"detail": "User account disabled."})

        except UserInfo.DoesNotExist:
            try:
                user = User.objects.filter(email=username, password=password).latest('date_joined')

                if user.is_active:
                    validated_data['user'] = user
                    return validated_data

            except User.DoesNotExist:
                #raise serializers.ValidationError("s")
                raise serializers.ValidationError({'detail': 'Unable to log in with provided credentials.'})
    else:
        raise serializers.ValidationError({"detail" : "Must include username and password."})

class Meta:
    model = Token
    fields = ("username", "password", "token")

Я попытался добавить собственный обработчик исключений:

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)

    # Now add the HTTP status code to the response.
    if response is not None:
        response.data['status_code'] = response.status_code


    return response

views.py: if serializer.is_valid(raise_exception=True):

Однако это только добавляет текущую возникшую ошибку:

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

Как мне использовать изменение формата возвращаемого текста? Он возвращает JSON только для этого конкретного сериализатора в функции проверки.

Я также изучил форматирование шаблона non_field_errors, но он работает со всеми моими другими сериализаторами, например:

{"detail": "Account exists with email address."}

person bwintz    schedule 22.02.2016    source источник


Ответы (1)


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

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

person mariodev    schedule 22.02.2016
comment
Я добавил собственный класс рендерера JSON и использую его с моим классом сериализатора. Я переформатировал средство визуализации, но его конкретный случай не работает, если не используется массив JSON: def render(self, data, accepted_media_type=None, renderer_context=None): data = { 'renderer_test' : data['detail'][0] } return super(CustomJSONRenderer, self).render(data, accepted_media_type, renderer_context) Возвращает это то, что я ищу: {"renderer_test":"Unable to log in with provided credentials."} Но получает KeyError с подробностями - person bwintz; 23.02.2016
comment
Разве не должен быть простой способ избежать использования массивов в JSON при вызове ValidationErrors? Каково соглашение для ответов об ошибках JSON через DRF? Было бы разумнее создать единый массив объектов в качестве значения детали для всех ошибок? - person bwintz; 23.02.2016