В DRF, Как внедрить полный `ErrorDetail` в ответ, используя пользовательский обработчик исключений?
Я использую довольно сложный пользовательский обработчик в DRF.
Например, для данного ответа response.data
может выглядеть следующим образом:
{'global_error': None, 'non_field_errors': [], 'field_errors': {'important_field': [ErrorDetail(string='Ce champ est obligatoire.', code='required')]}}
Однако при получении фактического ответа от API, ErrorDetail
будет преобразован в простую строку, потеряв информацию о коде.
Существует ли простой способ обеспечить, чтобы ErrorDetail
всегда записывался в ответ как {"message": "...", "code": "..."}
, не преобразуя ответ вручную в пользовательском обработчике?
Я знаю, что существует метод DRF get_full_details()
, который возвращает именно это при исключении. Но я нахожусь на уровне ответа.
Не знаю, используете ли вы его, но вы могли бы использовать custom_exception_handler
для преобразования всех возникающих исключений в формат, который вы предоставляете. Вот пример:
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is not None:
response.data["timestamp"] = datetime.now().isoformat()
response.data["error_type"] = exc.__class__.__name__
response.data["path"] = context["request"].path
return response
Используя его, вот что получилось:
{
"detail": "Authentication credentials were not provided.",
"timestamp": "2024-03-29T20:09:02.228370",
"error_type": "NotAuthenticated",
"path": "/tools/"
}
P.S.: Он также может принимать детализацию за исключение, возникающее из validate
в сериализаторах.
Вот документация: custom_execption_handler