Общее сообщение об ошибке по умолчанию в случае любого исключения в django
Я разрабатываю Restful API с помощью Django.
В случае ошибки вместо того, чтобы поднимать исключение по умолчанию в python или добавлять try except в каждом представлении, есть ли способ добавить сообщение об ошибке по умолчанию, которое будет возвращено?
через настройки django? через url'ы? через декоррелятор?
спасибо заранее :)
Оз
Поскольку вы используете DRF, вы можете определить свой собственный обработчик исключений:
def custom_api_exception_handler(exc, ctx):
if isinstance(exc, DjangoValidationError):
exc = exceptions.ValidationError(as_serializer_error(exc))
if isinstance(exc, Http404):
exc = exceptions.NotFound()
if isinstance(exc, PermissionDenied):
exc = exceptions.PermissionDenied()
response = exception_handler(exc, ctx)
# If unexpected error occurs (server error, etc.)
if response is None:
if isinstance(exc, YourCustomApplicationError):
data = {"message": exc.message, "extra": exc.extra}
return Response(data, status=400)
return response
if isinstance(exc.detail, (list, dict)):
response.data = {"detail": response.data}
if isinstance(exc, exceptions.ValidationError):
response.data["message"] = "Validation error"
response.data["extra"] = {"fields": response.data["detail"]}
else:
response.data["message"] = response.data["detail"]
response.data["extra"] = {}
del response.data["detail"]
return response
и определите ваше пользовательское исключение:
class YourCustomApplicationError(Exception):
def __init__(self, message, extra=None):
super().__init__(message)
self.message = message
self.extra = extra or {}
Приведенный выше пример имеет следующий формат, однако вы можете адаптировать его под свои нужды.
{
"message": "Error message",
"extra": {}
}
Для того чтобы использовать ваш пользовательский обработчик исключений в API, в settings.py
добавьте пользовательский обработчик исключений в настройки DRF:
REST_FRAMEWORK = {
"EXCEPTION_HANDLER": "path-to-custom-exception-handler.custom_api_exception_handler",
...
}
Документация: https://www.django-rest-framework.org/api-guide/exceptions/#custom-exception-handling
EDIT: Забыл упомянуть, что вы также можете использовать ваше пользовательское исключение в сервисах для валидации и т.д.
if some_condition:
raise YourCustomApplicationError(msg)