Django Rest Framework: не работает обработчик исключений - PullRequest
0 голосов
/ 27 февраля 2020

Обработчик исключений Django Rest Framework, похоже, не работает для меня. ValidationErrors превращается в 500 ответов.

Когда поднимается ValidationError, он не конвертируется в 400.

Traceback (most recent call last):
  File "/example/.local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/example/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/example/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/example/.local/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/example/.local/lib/python3.6/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/example/app/views.py", line 25, in post
    serializer.is_valid(raise_exception=True)
  File "/example/.local/lib/python3.6/site-packages/rest_framework/serializers.py", line 242, in is_valid
    raise ValidationError(self.errors)
rest_framework.exceptions.ValidationError: {'email': [ErrorDetail(string='Enter a valid email address.', code='invalid')]}
[26/Feb/2020 20:44:54] "POST /login/ HTTP/1.1" 500 84465

В settings.py У меня

INSTALLED_APPS = [
    # ...
    'rest_framework',
]

Но я получаю одно и то же поведение, независимо от того, есть у меня rest_framework в моем INSTALLED_APPS или нет.

Добавление этого к settings.py также не имеет никакого эффекта:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'bla',
}

Я что-то упускаю из виду?

1 Ответ

0 голосов
/ 01 марта 2020

Оказывается, это зависит от представления, которое вы подклассируете при создании исключения.

Я занимался подклассами View, который не работал:

from rest_framework import views
from rest_framework.exceptions import ValidationError


class LoginView(views.View):
    def post(self, request):
        raise ValidationError()

Переключение использование GenericAPIView исправило мою проблему:

from rest_framework import generics
from rest_framework.exceptions import ValidationError


class LoginView(generics.GenericAPIView):
    def post(self, request):
        raise ValidationError()
...