Вернуть код состояния 422 в ModelViewSet

Для взаимодействия с EmberData кажется Мне нужно ответить 422 (Unprocessable Entity) вместо 400 (Bad Request) всякий раз, когда возникают ошибки проверки. У меня есть два вопроса:

И бонус:

  • Почему EmberData ожидает 422? Насколько я понимаю, это не часть спецификации JSONAPi.

person blueFast    schedule 05.01.2016    source источник


Ответы (1)


422 является частью DRF WebDAV, коды ошибок которого отсутствуют в DRF. Это не мешает вам использовать его. Это просто удобочитаемая версия самого числа.

Одним из вариантов было бы переопределить rest_framework.exceptions.ValidationError.status_code и установить его на 422.

Изменить. Изменение кода ошибки по умолчанию:

# At the top of a views.py file, by the ends of import add:
from rest_framework.exceptions import ValidationError
ValidationError.status_code = 422
person Linovia    schedule 05.01.2016
comment
Спасибо. Я также нашел связанную ссылку: github.com/tomchristie/django-rest-framework /вопросы/3587. Но возникает вопрос: почему EmberData использует (фактически требует) код состояния, который не является частью стандарта http? - person blueFast; 05.01.2016
comment
Я нашел определение ValidationError (github. com/tomchristie/django-rest-framework/blob/master/), но это импортируется непосредственно django-rest-framework, и, похоже, не существует метода настройки класса ValidationError, поэтому даже если я предоставьте мою собственную версию подкласса, я понятия не имею, как сказать drf использовать ее. У вас есть идея, как этого добиться? - person blueFast; 05.01.2016
comment
Спасибо, но у меня есть общий вопрос об импорте python: если я делаю это в одном файле представления (views1.py) и не делаю этого в другом файле представления (views2.py), что такое status_code в классе ValidationError в views2. пи? Он изменен или оригинал? Я бы сказал, что изменение его в любом файле представления изменит его глобально (существует только один класс ValidationError), так что это заставит все мои представления drf использовать 422 status_code, верно? В моем случае это нормально, так как я взаимодействую только с EmberData, но я бы сказал, что это не очень чистый способ изменения status_code в общем случае? - person blueFast; 05.01.2016
comment
Фрагмент кода изменит все экземпляры ValidationError при условии, что сам экземпляр не переопределит его впоследствии. Короче говоря, как только это будет сделано один раз, все ValidationError вернут ошибку 422. - person Linovia; 05.01.2016
comment
Если вам нужен более подробный код ошибки, это будет сложнее, и вам, вероятно, придется переопределить обработчик исключений по умолчанию, чтобы выбрать, какой код возврата вы будете использовать в соответствии с другими условиями. - person Linovia; 05.01.2016
comment
Я выбрал второе решение (хотя это хак), потому что мне не нужно менять виртуальную среду на каждой машине. - person cegprakash; 15.05.2018