Исключения 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 аутентификации и других схем. Используйте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.MisdirectedRequest(description=None, response=None) -
421 Неправильный адрес запроса
Указывает, что запрос был отправлен серверу, неспособному сгенерировать ответ.
Changelog
Добавлен в версии 3.1.
-
exception werkzeug.exceptions.UnprocessableEntity(description=None, response=None) -
422
Unprocessable EntityИспользуется, если запрос правильно сформирован, но инструкции ошибочны.
-
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Сервер отказывается обрабатывать запрос, потому что заголовки слишком велики. Один или несколько отдельных полей могут быть слишком большими, или набор всех заголовков слишком большой.
-
451
Unavailable For Legal ReasonsЭтот код состояния указывает, что сервер отказывается предоставлять доступ к ресурсу в соответствии с юридическим требованием.
-
exception werkzeug.exceptions.InternalServerError(description=None, response=None, original_exception=None) -
500
Internal Server ErrorВызывается, если произошла внутренняя ошибка сервера. Это хороший вариант по умолчанию, если в диспетчере произошла неизвестная ошибка.
Changelog
Изменено в версии 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Если в вашем приложении используется проксирование, вы должны вернуть этот код состояния, если вы получили неверный ответ от сервера upstream, к которому обратился при попытке выполнить запрос.
-
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) -
Вызывается, если что-то вызывает ошибку безопасности. В остальном это точно так же, как ошибка плохого запроса.
Changelog
Добавлен в версии 0.9.
Базовый класс
Все исключения реализуют этот общий интерфейс:
-
exception werkzeug.exceptions.HTTPException(description=None, response=None) -
Базовый класс для всех исключений HTTP. Это исключение может вызываться как WSGI-приложение для отображения страницы ошибки по умолчанию, или вы можете поймать подклассы независимо и отобразить более подробные сообщения об ошибках.
Changelog
Изменено в версии 2.1: Удален метод
wrap.-
get_response(environ=None, scope=None) -
Получить объект ответа. Если он был передан в исключение, он возвращается непосредственно.
-
__call__(environ, start_response) -
Вызвать исключение как WSGI-приложение.
- Parameters:
-
- environ (WSGIEnvironment) – WSGI-среда.
- start_response (StartResponse) – вызываемая функция ответа, предоставленная WSGI-сервером.
- Return type:
-
t.Iterable[bytes]
-
Особые исключения 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.
-
exception werkzeug.exceptions.BadRequestKeyError(arg=None, *args, **kwargs) -
Исключение, используемое для сигнализации как
KeyError, так иBadRequest. Используется многими структурами данных.- Parameters:
-
- arg (object | 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'))
Если вы хотите использовать эту функциональность с пользовательскими исключениями, вы можете создать экземпляр класса aborter:
-
class werkzeug.exceptions.Aborter(mapping=None, extra=None) -
При передаче словаря code -> item исключения он может использоваться как вызываемая функция, которая вызывает исключения. Если первым аргументом вызываемой функции является целое число, оно будет найдено в отображении, если это 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/latest/exceptions/