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."}
Я добавил собственный класс рендеринга 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
Не должно быть простого способа избежать использования массивов в JSON при повышении ValidationErrors? Какова конвенция для ответов об ошибках JSON через DRF? Имеет ли смысл создавать единый массив объектов как значение детали для всей ошибки? – bwintz