Ответ 1
Структура Django REST предоставляет несколько встроенных исключений, которые в основном являются подклассами DRF APIException
.
Вы можете создавать исключения в своем представлении, как обычно, в Python:
from rest_framework.exceptions import APIException
def my_view(request):
raise APIException("There was a problem!")
Вы также можете создать собственное собственное исключение, наследуя от APIException
и устанавливая status_code
и default_detail
. Некоторые из встроенных: ParseError
, AuthenticationFailed
, NotAuthenticated
, PermissionDenied
, NotFound
, NotAcceptable
, ValidationError
и т.д.
Затем они будут преобразованы в Response
обработчиком исключений REST Framework. Каждое исключение связано с кодом состояния, который добавляется к Response
. По умолчанию обработчик исключений настроен на встроенный обработчик:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}
Но вы можете настроить его на свой собственный обработчик исключений, если вы хотите самостоятельно преобразовать исключения, изменив это в своем файле settings.py
:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}
И затем создайте пользовательский обработчик в этом месте:
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
# Call REST framework default exception handler first,
# to get the standard error response.
response = exception_handler(exc, context)
# Now add the HTTP status code to the response.
if response is not None:
response.data['status_code'] = response.status_code
return response