0

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

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

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

Looking достижения:

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

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

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} 

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

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

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

ответ

0

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

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

+0

Я добавил собственный класс рендеринга 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": «Не удалось войти в систему с предоставленными учетными данными».} ' Но получает KeyError с« деталью » – bwintz

+0

Не должно быть простого способа избежать использования массивов в JSON при повышении ValidationErrors? Какова конвенция для ответов об ошибках JSON через DRF? Имеет ли смысл создавать единый массив объектов как значение детали для всей ошибки? – bwintz

Смежные вопросы