HTTP-исключения
werkzeug.exceptions
Этот модуль реализует ряд исключений Python, которые можно генерировать изнутри ваших представлений, чтобы вызвать стандартный ответ, отличный от 200.
Пример использования
from werkzeug.wrappers import BaseRequest
from werkzeug.wsgi import responder
from werkzeug.exceptions import HTTPException, NotFound
def view(request):
raise NotFound()
@responder
def application(environ, start_response):
request = BaseRequest(environ)
try:
return view(request)
except HTTPException as e:
return e
Как видно из этого примера, эти исключения являются вызываемыми WSGI-приложениями. Из-за совместимости с Python 2.4 они не наследуются от объектов ответа, а только от класса исключения Python.
Фактически, они не являются объектами ответа Werkzeug. Однако вы можете получить объект ответа, вызвав get_response() для HTTP-исключения.
Помните, что вы должны передать среду get_response(), так как некоторые ошибки извлекают дополнительную информацию из среды WSGI.
Если вы хотите подключить другую страницу исключений, скажем, для кода состояния 404, вы можете добавить второй блок except для конкретного подкласса ошибки:
@responder
def application(environ, start_response):
request = BaseRequest(environ)
try:
return view(request)
except NotFound, e:
return not_found(request)
except HTTPException, e:
return e
Классы ошибок
В Werkzeug существуют следующие классы ошибок:
-
exception werkzeug.exceptions.BadRequest(description=None, response=None) -
400
Bad RequestВызывается, если браузер отправляет что-то приложению или серверу, что они не могут обработать.
-
401
UnauthorizedВызывается, если пользователь не имеет права доступа к ресурсу.
Аргумент
www_authenticateдолжен использоваться для установки заголовкаWWW-Authenticate. Он используется для HTTP-аутентификации по основанию и других схем. ИспользуйтеWWWAuthenticateдля создания правильно отформатированных значений. Строго говоря, ответ 401 является некорректным, если он не предоставляет по крайней мере одно значение для этого заголовка, хотя реальные клиенты обычно не обращают на это внимания.Параметры: - description – Переопределите стандартное сообщение, используемое для тела ответа.
- 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) -
405
Method Not AllowedВызывается, если сервер использовал метод, который ресурс не обрабатывает. Например,
POST, если ресурс только для просмотра. Особенно полезно для REST.Первый аргумент для этого исключения должен быть списком разрешенных методов. Строго говоря, ответ будет некорректным, если вы не предоставите допустимые методы в заголовке, что вы можете сделать с этим списком.
-
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.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) -
416
Requested Range Not SatisfiableКлиент запросил недопустимую часть файла.
Добавлен в версии 0.7.
-
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Сервер должен возвращать это, если он является чайником, и кто-то пытался сварить кофе с его помощью.
Добавлен в версии 0.7.
-
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) -
429
Too Many RequestsСервер ограничивает скорость, с которой этот пользователь получает ответы, и этот запрос превышает эту скорость. (Сервер может использовать любой удобный метод для идентификации пользователей и их скоростей запросов). Сервер может включить заголовок «Retry-After», чтобы указать, сколько времени пользователю следует подождать перед повторной попыткой.
-
exception werkzeug.exceptions.RequestHeaderFieldsTooLarge(description=None, response=None) -
431
Request Header Fields Too LargeСервер отказывается обрабатывать запрос, потому что поля заголовка слишком велики. Одно или несколько отдельных полей могут быть слишком большими, или набор всех заголовков слишком велик.
-
exception werkzeug.exceptions.InternalServerError(description=None, response=None) -
500
Internal Server ErrorВызывается, если произошла внутренняя ошибка сервера. Это хороший резервный вариант, если произошла неизвестная ошибка в диспетчере.
-
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Код состояния, который вы должны вернуть, если услуга временно недоступна.
-
exception werkzeug.exceptions.HTTPUnicodeError -
Это исключение используется для сигнализации об ошибках декодирования unicode данных запроса. Для получения дополнительной информации см. главу Unicode.
-
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-приложения для отображения страницы с ошибкой по умолчанию, или вы можете перехватывать подклассы этого исключения, чтобы отображать более подробные сообщения об ошибках.
-
__call__(environ, start_response) -
Вызов исключения как WSGI-приложения.
Параметры: - environ – среда WSGI.
- start_response – вызываемый объект ответа, предоставленный сервером WSGI.
-
get_response(environ=None) -
Получение объекта ответа. Если исключению был передан объект ответа, он возвращается напрямую.
Параметры: environ – необязательная среда для запроса. Это может использоваться для изменения ответа в зависимости от того, как выглядел запрос. Возвращает: объект 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.
-
exception werkzeug.exceptions.BadRequestKeyError(arg=None, *args, **kwargs) -
Исключение, используемое для сигнализации как
KeyError, так иBadRequest. Используется многими структурами данных.
Простое прерывание
Иногда удобно просто вызвать исключение по коду ошибки, не импортируя исключение и не ища имя и т. д. Для этой цели существует функция abort().
-
werkzeug.exceptions.abort(status, *args, **kwargs) -
Вызывает исключение
HTTPExceptionдля заданного кода состояния или WSGI-приложения:abort(404) # 404 Not Found abort(Response('Hello World'))Может принимать WSGI-приложение или код состояния. Если задан код состояния, он ищется в списке исключений и вызовет это исключение; если передано WSGI-приложение, оно будет обернуто в исключение-прокси WSGI и вызвано:
abort(404) abort(Response('Hello World'))
Если вы хотите использовать эту функциональность с пользовательскими исключениями, можно создать экземпляр класса aborter:
-
class werkzeug.exceptions.Aborter(mapping=None, extra=None) -
При передаче словаря кодов -> элементов исключений он может использоваться как вызываемый объект, который вызывает исключения. Если первым аргументом вызываемого объекта является целое число, оно будет найдено в отображении; если это WSGI-приложение, оно будет вызвано в исключении-прокси.
Остальные аргументы передаются конструктору исключения.
Пользовательские ошибки
Как видно из списка выше, не все коды состояний доступны в качестве ошибок. Особенно отсутствуют перенаправления и другие коды состояний, отличные от 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(). В любом случае следует ознакомиться с исходным кодом модуля exceptions.
Можно переопределить стандартное описание в конструкторе с параметром description:
raise BadRequest(description='Request failed because X was not present')
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/0.15.x/exceptions/