Общее сообщение об ошибке по умолчанию в случае любого исключения в 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)
Вернуться на верх