Исключения 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, вы можете добавить второй обработчик исключений для конкретного подкласса ошибки:
@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-аутентификации по основанию и других схем. ИспользуйтеWWWAuthenticateдля создания правильно отформатированных значений. Строго говоря, ответ 401 недействителен, если он не предоставляет хотя бы одно значение для этого заголовка, хотя реальные клиенты, как правило, не обращают на это внимания.- Параметры:
-
- description (str | None) – Переопределяет стандартное сообщение, используемое для тела ответа.
- www-authenticate – Единственное значение или список значений для заголовка(ов) WWW-Authenticate.
- response (Response | None) –
- www_authenticate (None | (WWWAuthenticate | t.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.RequestTimeout(description=None, response=None) -
408
Request TimeoutВызвать для сигнализации о тайм-ауте.
-
exception werkzeug.exceptions.Conflict(description=None, response=None) -
409
ConflictВызвать, чтобы указать, что запрос не может быть выполнен, потому что он конфликтует с текущим состоянием на сервере.
Журнал изменений
Новое в версии 0.7.
-
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Клиент запросил неверную часть файла.
Changelog
Новый в версии 0.7.
Принимает необязательное значение заголовка
Content-Rangeна основе параметраlength.
-
exception werkzeug.exceptions.ExpectationFailed(description=None, response=None) -
417
Expectation FailedСервер не может выполнить требования заголовка Expect запроса.
Changelog
Новый в версии 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 Требуется условие для этого запроса, обычно для предотвращения проблемы с потерянным обновлением, которая представляет собой состояние гонки между двумя или более клиентами, пытающимися обновить ресурс с помощью 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
Изменения
Изменено в версии 1.0: Добавлен параметр
retry_after.
-
exception werkzeug.exceptions.RequestHeaderFieldsTooLarge(description=None, response=None) -
431
Request Header Fields Too LargeСервер отказывается обрабатывать запрос, потому что заголовки слишком длинные. Один или несколько отдельных полей могут быть слишком длинными, или набор всех заголовков слишком велик.
-
451
Unavailable For Legal ReasonsЭтот код состояния указывает, что сервер отказывается предоставить доступ к ресурсу в соответствии с правовым требованием.
-
exception werkzeug.exceptions.InternalServerError(description=None, response=None, original_exception=None) -
500
Internal Server ErrorВызывается, если произошла внутренняя ошибка сервера. Это хороший вариант по умолчанию, если в диспетчере произошла неизвестная ошибка.
Изменения
Изменено в версии 1.0.0: Добавлен атрибут
original_exception.- Параметры:
-
- description (str | None) –
- response (Response | None) –
- original_exception (BaseException | None) –
- Тип возвращаемого значения:
-
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
Изменения
Изменено в версии 1.0: Добавлен параметр
retry_after.
-
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, это исключение может или не может быть сгенерировано, если клиент отсутствует.
Журнал изменений
Добавлена в версии 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.-
__call__(environ, start_response) -
Вызов исключения как WSGI-приложения.
- Параметры:
-
- environ (WSGIEnvironment) – окружение WSGI.
- start_response (StartResponse) – вызываемая функция ответа, предоставляемая WSGI-сервером.
- Тип возвращаемого значения:
-
t.Iterable[байты]
-
get_response(environ=None, scope=None) -
Получение объекта ответа. Если объект был передан исключению, он возвращается напрямую.
- Параметры:
-
- environ (WSGIEnvironment | WSGIRequest | None) – необязательное окружение для запроса. Это можно использовать для изменения ответа в зависимости от того, как выглядел запрос.
- scope (словарь | None) –
- Возвращаемое значение:
-
объект
Responseили его подкласс. - Тип возвращаемого значения:
-
Специальные HTTP-исключения
Начиная с Werkzeug 0.3 некоторые встроенные классы генерируют исключения, которые выглядят как обычные Python-исключения (например, KeyError), но одновременно являются BadRequest HTTP-исключениями. Это решение было принято для упрощения распространённого шаблона, где нужно прервать выполнение, если клиент внес изменения в данные формы таким образом, что приложение не может их обработать и должно прервать выполнение с 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, но также является BadRequest исключением.
-
exception werkzeug.exceptions.BadRequestKeyError(arg=None, *args, **kwargs) -
Исключение, используемое для сигнализации как о
KeyError, так и оBadRequest. Используется многими структурами данных.- Параметры:
-
- arg (str | None) –
- args (t.Any) –
- kwargs (t.Any) –
Простые прерывания
Иногда удобно просто вызвать исключение по коду ошибки, не импортируя исключение и не находя его имя и т.д. Для этой цели существует функция abort().
-
werkzeug.exceptions.abort(status, *args, **kwargs) -
Вызывает
HTTPExceptionдля заданного кода состояния или WSGI-приложения.Если задан код состояния, он будет найден в списке исключений, и это исключение будет вызвано. Если передано WSGI-приложение, оно будет обернуто в прокси-исключение WSGI и вызвано:
abort(404) # 404 Not Found abort(Response('Hello World'))
Если вы хотите использовать эту функциональность с пользовательскими исключениями, вы можете создать экземпляр класса прерывателя:
-
class werkzeug.exceptions.Aborter(mapping=None, extra=None) -
При передаче словаря элементов код -> исключение он может использоваться как вызываемый объект, который вызывает исключения. Если первым аргументом вызываемого объекта является целое число, оно будет найдено в отображении, если это WSGI-приложение, оно будет вызвано в прокси-исключении.
Остальные аргументы передаются в конструктор исключения.
- Параметры:
-
- mapping (dict[int, type[HTTPException]] | None) –
- extra (dict[int, type[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 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/3.0.x/exceptions/