Исключения HTTP
Реализует ряд исключений Python, которые могут быть подняты из представления для запуска стандартного HTTP ответа, отличного от 200.
Пример использования
from werkzeug.wrappers.request import Request
from werkzeug.exceptions import HTTPException, NotFound
def view(request):
raise NotFound()
@Request.application
def application(request):
try:
return view(request)
except HTTPException as e:
return e
Как видно из этого примера, эти исключения являются вызываемыми WSGI приложениями. Однако они не являются объектами ответа Werkzeug. Вы можете получить объект ответа, вызвав get_response() для исключения HTTP.
Помните, что вам может потребоваться передать среду (WSGI) или область (ASGI) в get_response(), так как некоторые ошибки извлекают дополнительную информацию, относящуюся к запросу.
Если вы хотите подключить другую страницу обработки исключений, например, для кода состояния 404, вы можете добавить второй блок except для конкретного подкласса ошибки:
@Request.application
def application(request):
try:
return view(request)
except NotFound as e:
return not_found(request)
except HTTPException as e:
return e
Классы ошибок
В Werkzeug существуют следующие классы ошибок:
-
exception werkzeug.exceptions.BadRequest(description=None, response=None) -
400
Bad RequestВызывается, если браузер отправляет что-то приложению или серверу, с чем приложение или сервер не могут справиться.
-
exception werkzeug.exceptions.Unauthorized(description=None, response=None, www_authenticate=None) -
401
UnauthorizedВызывается, если пользователь не авторизован для доступа к ресурсу.
Аргумент
www_authenticateдолжен использоваться для установки заголовкаWWW-Authenticate. Это используется для HTTP basic auth и других схем. ИспользуйтеWWWAuthenticateдля создания правильно отформатированных значений. Строго говоря, ответ 401 некорректен, если он не предоставляет по крайней мере одно значение для этого заголовка, хотя реальные клиенты обычно об этом не беспокоятся.- Параметры
-
- description (Optional[str]) – Переопределяет сообщение по умолчанию, используемое для тела ответа.
- www-authenticate – Одно значение или список значений для заголовка(ов) WWW-Authenticate.
- response (Optional[Response]) –
- www_authenticate (Optional[Union[WWWAuthenticate, Iterable[WWWAuthenticate]]]) –
- Тип возвращаемого значения
-
None
Журнал изменений
Изменено в версии 2.0: Сериализация нескольких элементов
www_authenticateв несколько заголовковWWW-Authenticate, а не объединение их в одно значение, для лучшей совместимости.Изменено в версии 0.15.3: Если аргумент
www_authenticateне задан, заголовокWWW-Authenticateне устанавливается.Изменено в версии 0.15.3: Аргумент
responseбыл восстановлен.Изменено в версии 0.15.1:
descriptionбыл перемещен обратно в качестве первого аргумента, восстанавливая его предыдущее положение.Изменено в версии 0.15.0:
www_authenticateбыл добавлен в качестве первого аргумента, передdescription.
-
exception werkzeug.exceptions.Forbidden(description=None, response=None) -
403
ForbiddenВызывается, если у пользователя нет разрешения на доступ к запрашиваемому ресурсу, но он был аутентифицирован.
-
exception werkzeug.exceptions.NotFound(description=None, response=None) -
404
Not FoundВызывается, если ресурс не существует и никогда не существовал.
-
exception werkzeug.exceptions.MethodNotAllowed(valid_methods=None, description=None, response=None) -
405
Method Not AllowedВызывается, если сервер использует метод, который ресурс не обрабатывает. Например,
POSTесли ресурс только для просмотра. Особенно полезно для REST.Первый аргумент для этой исключительной ситуации должен быть списком разрешённых методов. Строго говоря, ответ будет некорректным, если вы не предоставите допустимые методы в заголовке, что вы можете сделать с этим списком.
Принимает необязательный список допустимых http-методов, начиная с Werkzeug 0.3 этот список будет обязательным.
-
exception werkzeug.exceptions.NotAcceptable(description=None, response=None) -
406
Not AcceptableВызывается, если сервер не может вернуть какой-либо контент, соответствующий заголовкам
Acceptклиента.
-
exception werkzeug.exceptions.Conflict(description=None, response=None) -
409
ConflictВызвать, чтобы указать, что запрос не может быть выполнен, так как он конфликтует с текущим состоянием на сервере.
Журнал изменений
Добавлена в версии 0.7.
-
exception werkzeug.exceptions.Gone(description=None, response=None) -
410
GoneВызвать, если ресурс существовал ранее и исчез без нового местоположения.
-
exception werkzeug.exceptions.LengthRequired(description=None, response=None) -
411
Length RequiredВызвать, если браузер передал данные, но нет заголовка
Content-Length, который необходим для обработки сервером.
-
exception werkzeug.exceptions.PreconditionFailed(description=None, response=None) -
412
Precondition FailedКод состояния, используемый в сочетании с
If-Match,If-None-Match, илиIf-Unmodified-Since.
-
exception werkzeug.exceptions.RequestEntityTooLarge(description=None, response=None) -
413
Request Entity Too LargeКод состояния, который следует возвращать, если переданные данные превысили заданный лимит.
-
exception werkzeug.exceptions.RequestURITooLarge(description=None, response=None) -
414
Request URI Too LargeПодобно 413, но для слишком длинных URL.
-
exception werkzeug.exceptions.UnsupportedMediaType(description=None, response=None) -
415
Unsupported Media TypeКод состояния, возвращаемый, если сервер не может обработать тип носителя, переданный клиентом.
-
exception werkzeug.exceptions.RequestedRangeNotSatisfiable(length=None, units='bytes', description=None, response=None) -
416
Requested Range Not SatisfiableКлиент запросил неверную часть файла.
Журнал изменений
Добавлена в версии 0.7.
Принимает необязательное значение заголовка
Content-Rangeна основе параметраlength.
-
exception werkzeug.exceptions.ExpectationFailed(description=None, response=None) -
417
Expectation FailedСервер не может выполнить требования заголовка Expect запроса.
Журнал изменений
Добавлена в версии 0.7.
-
exception werkzeug.exceptions.ImATeapot(description=None, response=None) -
418
I’m a teapotСервер должен вернуть это значение, если это чайник, и кто-то пытался сварить на нём кофе.
Changelog
Новое в версии 0.7.
-
exception werkzeug.exceptions.UnprocessableEntity(description=None, response=None) -
422
Unprocessable EntityИспользуется, если запрос правильно сформирован, но инструкция некорректна.
-
exception werkzeug.exceptions.Locked(description=None, response=None) -
423
LockedИспользуется, если к ресурсу, к которому осуществляется доступ, применён блокировка.
-
exception werkzeug.exceptions.FailedDependency(description=None, response=None) -
424
Failed DependencyИспользуется, если метод не может быть выполнен над ресурсом, потому что запрашиваемое действие зависит от другого действия, которое не удалось выполнить.
-
exception werkzeug.exceptions.PreconditionRequired(description=None, response=None) -
428
Precondition RequiredСервер требует, чтобы этот запрос был условным, обычно для предотвращения проблемы с потерянными обновлениями, которая представляет собой состояние гонки между двумя или более клиентами, пытающимися обновить ресурс через PUT или DELETE. Требуя от каждого клиента включать заголовок условия («If-Match» или «If-Unmodified-Since») со значением, сохранённым из недавнего запроса GET, сервер гарантирует, что каждый клиент по крайней мере видел предыдущую версию ресурса.
-
exception werkzeug.exceptions.TooManyRequests(description=None, response=None, retry_after=None) -
429
Too Many RequestsСервер ограничивает скорость, с которой этот пользователь получает ответы, и этот запрос превышает эту скорость. (Сервер может использовать любой удобный метод для идентификации пользователей и их скоростей запросов). Сервер может включить заголовок «Retry-After», чтобы указать, сколько времени пользователю следует подождать перед повторной попыткой.
- Параметры
- Тип возвращаемого значения
-
None
Changelog
Изменено в версии 1.0: Добавлен параметр
retry_after.
-
exception werkzeug.exceptions.RequestHeaderFieldsTooLarge(description=None, response=None) -
431
Request Header Fields Too LargeСервер отказывается обрабатывать запрос, потому что поля заголовков слишком велики. Одно или несколько отдельных полей могут быть слишком большими, или набор всех заголовков слишком большой.
-
exception werkzeug.exceptions.InternalServerError(description=None, response=None, original_exception=None) -
500
Internal Server ErrorВызвать, если произошла внутренняя ошибка сервера. Это хороший вариант по умолчанию, если в диспетчере произошла неизвестная ошибка.
Changelog
Изменено в версии 1.0.0: Добавлен атрибут
original_exception.- Параметры
- Тип возвращаемого значения
-
None
-
original_exception -
Исходное исключение, вызвавшее эту ошибку 500. Может быть использовано фреймворками для предоставления контекста при обработке неожиданных ошибок.
-
exception werkzeug.exceptions.NotImplemented(description=None, response=None) -
501
Not ImplementedВызвать, если приложение не поддерживает действие, запрошенное браузером.
-
exception werkzeug.exceptions.BadGateway(description=None, response=None) -
502
Bad GatewayЕсли в вашем приложении используется проксирование, верните этот код состояния, если вы получили недействительный ответ от сервера-источника, к которому обращался сервер при попытке выполнить запрос.
-
503
Service UnavailableКод состояния, который следует возвращать, если служба временно недоступна.
- Параметры
- Тип возвращаемого значения
-
None
Changelog
Изменено в версии 1.0: Добавлен параметр
retry_after.
-
exception werkzeug.exceptions.GatewayTimeout(description=None, response=None) -
504
Gateway TimeoutКод состояния, который следует возвращать, если соединение с сервером-источником истекло.
-
exception werkzeug.exceptions.HTTPVersionNotSupported(description=None, response=None) -
505
HTTP Version Not SupportedСервер не поддерживает версию HTTP, используемую в запросе.
-
exception werkzeug.exceptions.ClientDisconnected(description=None, response=None) -
Внутреннее исключение, которое генерируется, если Werkzeug обнаруживает отключение клиента. Поскольку клиент уже ушел, попытка отправить сообщение об ошибке клиенту может не сработать и в конечном итоге привести к другой ошибке на сервере. В основном это здесь для того, чтобы его по умолчанию игнорировал Werkzeug.
Поскольку отключения невозможно надежно обнаружить, а WSGI их не определяет, это исключение может или не может генерироваться, если клиент ушел.
Changelog
Добавлено в версии 0.8.
-
exception werkzeug.exceptions.SecurityError(description=None, response=None) -
Вызывается, если происходит ошибка безопасности. В ином случае это точно такая же ошибка неправильного запроса.
Журнал изменений
Новая в версии 0.9.
Базовый класс
Все исключения реализуют этот общий интерфейс:
-
exception werkzeug.exceptions.HTTPException(description=None, response=None) -
Базовый класс для всех исключений HTTP. Это исключение может вызываться как WSGI-приложение для отображения страницы с ошибкой по умолчанию, или вы можете перехватывать подклассы для отображения более удобных сообщений об ошибках.
Изменено в версии 2.1: Удален метод класса
wrap.- Параметры
- Тип возвращаемого значения
-
None
-
__call__(environ, start_response) -
Вызов исключения как WSGI-приложения.
-
get_response(environ=None, scope=None) -
Получение объекта ответа. Если он был передан в исключение, он возвращается напрямую.
- Параметры
- Возвращаемое значение
-
объект
Responseили его подкласс. - Тип возвращаемого значения
Особые исключения HTTP
Начиная с Werkzeug 0.3 некоторые встроенные классы вызывают исключения, которые выглядят как обычные исключения Python (например, KeyError), но одновременно являются исключениями HTTP BadRequest. Это решение было принято для упрощения распространённой ситуации, когда нужно прервать выполнение, если клиент произвёл изменения в данных формы, которые приложение не может обработать должным образом, и должно завершиться с 400 BAD REQUEST.
Предполагая, что приложение перехватывает все исключения HTTP и должным образом реагирует на них, функция представления может безопасно выполнить следующее и не должна проверять наличие ключей:
def new_post(request):
post = Post(title=request.form['title'], body=request.form['body'])
post.save()
return redirect(post.url)
Если title или body отсутствуют в форме, будет вызвано специальное исключение KeyError, которое ведёт себя как KeyError, но также является исключением BadRequest.
Простое прерывание
Иногда удобно просто вызвать исключение по коду ошибки, не импортируя само исключение и не ища его имя. Для этой цели существует функция abort().
-
werkzeug.exceptions.abort(status, *args, **kwargs) -
Вызывает
HTTPExceptionдля заданного кода состояния или WSGI-приложения.Если задан код состояния, он будет найден в списке исключений, и это исключение будет вызвано. Если передано WSGI-приложение, оно будет обернуто в прокси-исключение WSGI и вызвано:
abort(404) # 404 Not Found abort(Response('Hello World'))
Если вы хотите использовать эту функциональность с пользовательскими исключениями, вы можете создать экземпляр класса aborter:
-
class werkzeug.exceptions.Aborter(mapping=None, extra=None) -
При передаче словаря code -> exception items, он может использоваться как вызываемый объект, который вызывает исключения. Если первым аргументом вызываемого объекта является целое число, оно будет найдено в отображении, если это WSGI-приложение, оно будет вызвано в прокси-исключении.
Остальные аргументы передаются конструктору исключения.
- Параметры
-
- mapping (Optional[Dict[int, Type[werkzeug.exceptions.HTTPException]]]) –
- extra (Optional[Dict[int, Type[werkzeug.exceptions.HTTPException]]]) –
- Тип возвращаемого значения
-
None
Пользовательские ошибки
Как видно из списка выше, не все коды состояния доступны в качестве ошибок. Особенно отсутствуют перенаправления и другие коды состояния, отличные от 200, которые не представляют собой ошибки. Для перенаправлений вы можете использовать функцию redirect() из утилит.
Если вы хотите добавить свою собственную ошибку, вы можете наследовать от HTTPException:
from werkzeug.exceptions import HTTPException
class PaymentRequired(HTTPException):
code = 402
description = '<p>Payment required.</p>'
Это минимальный код, необходимый для собственного исключения. Если вы хотите добавить больше логики к ошибкам, вы можете переопределить методы get_description(), get_body(), get_headers() и get_response(). В любом случае вы должны посмотреть исходный код модуля исключений.
Вы можете переопределить стандартное описание в конструкторе с помощью параметра description:
raise BadRequest(description='Request failed because X was not present')
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.1.x/exceptions/