Django rest framework 3.10.3 не работает обработчик исключений - PullRequest
0 голосов
/ 10 ноября 2019

Я пробую свое первое приложение django rest Framework, я использую djangorestframework == 3.10.3

Я создал простой проект:

./mysite
./mysite/__init__.py
./mysite/settings.py
./mysite/urls.py
./mysite/wsgi.py
./db.sqlite3
./polls
./polls/migrations
./polls/migrations/__init__.py
./polls/models.py
./polls/__init__.py
./polls/apps.py
./polls/admin.py
./polls/exceptions.py
./polls/tests.py
./polls/urls.py
./polls/views.py
./manage.py

У меня есть одно представление в опросахприложение, которое генерирует только ParseError, который является ApiException (в соответствии с документацией он обрабатывается пользовательским исключением https://www.django -rest-framework.org / api-guide / exceptions / # custom-обработка исключений )

from django.views.decorators.csrf import csrf_exempt
from rest_framework.exceptions import ParseError

# Create your views here.
@csrf_exempt
def test_view(request):
    raise ParseError("test!", 409)

Вот мое пользовательское исключение, которое находится в polls / exceptions.py

из rest_framework.views import exception_handler

def base_exception_handler(exc, context):
    print('DEBUUUUUUUUUG!!!!!!!')
    return JsonResponse({"message": "base exception", "status": 404}, status=404)

И, наконец, mysite / settings.py - регистрация обработчика пользовательских исключений (все остальные файлы по умолчанию):

...
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'rest_framework',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
...
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'polls.exceptions.base_exception_handler',
}

при запуске сервера и переходе к представлению, определенному в http://localhost:8000/test, я получаю:

  1. если я установил для debug значение True - я получаю страницу исключения с исключением, которое я поднял
  2. , если я установил для debug значение False - я получаю страницу HTML с Ошибка сервера (500)

I trчтобы проверить, выполняется ли обработчик исключений по умолчанию, установив точку останова в rest_framework.views.exception_handler (я не изменил никакой настройки для него, поэтому он должен использовать значение по умолчанию, как описано в документации), однако он не вызывается. В ответ я получаю HTML-страницу.

Вот пакеты, которые я использую (needs.txt):

Django==2.2.7
djangorestframework==3.10.3
pytz==2019.3
sqlparse==0.3.0

Ваша помощь будет оценена.

1 Ответ

0 голосов
/ 11 ноября 2019

Если кто-то сталкивается с той же проблемой, вот решение. Проблема в том, что в представлении функций отсутствует декоратор @api_view (), это решает проблему:

from django.views.decorators.csrf import csrf_exempt
from rest_framework.exceptions import ParseError
from rest_framework.decorators import api_view

# Create your views here.
@csrf_exempt
@api_view()
def test_view(request):
        raise ParseError("test!", 409)

Было бы замечательно, если бы в документации было больше подробностей об этом.

...