Поскольку я столкнулся с похожей ситуацией, которая привела меня к этому вопросу, я отвечу на исходный вопрос, который конкретно связан с Django Rest Framework, а не только с Django.
Я понимаю, что вы хотите обрабатывать возникающие исключения из ваших представлений глобально, без необходимости определять блоки try/except в каждом модуле представления.
DRF позволяет определить собственный механизм обработки особых исключений (документы). Вот пример:
В my_custom_except_handler.py:
import logging
from rest_framework.views import exception_handler
from django.http import JsonResponse
from requests import ConnectionError
def custom_exception_handler(exc, context):
# Call REST framework's default exception handler first
response = exception_handler(exc, context)
# checks if the raised exception is of the type you want to handle
if isinstance(exc, ConnectionError):
# defines custom response data
err_data = {'MSG_HEADER': 'some custom error messaging'}
# logs detail data from the exception being handled
logging.error(f"Original error detail and callstack: {exc}")
# returns a JsonResponse
return JsonResponse(err_data, safe=False, status=503)
# returns response as handled normally by the framework
return response
Как указано в документах, определенный объект ответа относится к:
Функция обработчика исключений должна либо возвращать объект Response, либо возвращать None, если исключение не может быть обработано. Если обработчик вернет None, то исключение будет сгенерировано повторно, и Django вернет стандартный ответ HTTP 500 «ошибка сервера».
Другими словами, "ответ" не будет None только при обработке этих исключений документы:
- Подклассы APIException.
- Исключение Django Http404.
- Исключение Django PermissionDenied.
Если ваш пользовательский обработчик возвращает None, то исключение будет обрабатываться фреймворком "обычно", возвращая типичную ошибку сервера 500.
Наконец, не забудьте установить необходимый ключ в settings.py:
REST_FRAMEWORK = {'EXCEPTION_HANDLER':
'my_project.my_app.my_custom_except_handler.custom_exception_handler'}
Надеюсь, поможет!
person
NicoE
schedule
26.06.2020