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

如果浏览器向应用程序发送应用程序或服务器无法处理的内容,则引发。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

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

Changelog

在 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

如果用户没有所请求资源的权限,但已通过身份验证,则引发。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.NotFound(description=None, response=None)

404 Not Found

如果资源不存在且从未存在,则引发。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.MethodNotAllowed(valid_methods=None, description=None, response=None)

405 Method Not Allowed

如果服务器使用资源不处理的方法,则引发。例如 POST 如果资源是“仅查看”。对休息特别有用。

此异常的第一个参数应该是允许的方法列表。严格来说,如果您没有在头中提供有效的方法(您可以使用该列表),那么响应将是无效的。

获取从werkzeug 0.3开始的有效http方法的可选列表,该列表将是必选的。

参数:
  • valid_methods (t.Iterable[str] | None) --

  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.NotAcceptable(description=None, response=None)

406 Not Acceptable

如果服务器无法返回符合 Accept 客户端的头。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.RequestTimeout(description=None, response=None)

408 Request Timeout

升起以表示超时。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.Conflict(description=None, response=None)

409 Conflict

引发以表示请求无法完成,因为它与服务器上的当前状态冲突。

Changelog

在 0.7 版本加入.

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.Gone(description=None, response=None)

410 Gone

如果资源以前存在并且没有新位置而离开,则进行提升。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.LengthRequired(description=None, response=None)

411 Length Required

如果浏览器提交了数据但没有,则引发 Content-Length 服务器处理类型所需的头。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.PreconditionFailed(description=None, response=None)

412 Precondition Failed

与一起使用的状态代码 If-MatchIf-None-MatchIf-Unmodified-Since .

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.RequestEntityTooLarge(description=None, response=None)

413 Request Entity Too Large

如果提交的数据超过给定限制,则应返回状态代码1。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.RequestURITooLarge(description=None, response=None)

414 Request URI Too Large

喜欢 413 但是URL太长。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.UnsupportedMediaType(description=None, response=None)

415 Unsupported Media Type

如果服务器无法处理客户端传输的媒体类型,则返回状态代码。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.RequestedRangeNotSatisfiable(length=None, units='bytes', description=None, response=None)

416 Requested Range Not Satisfiable

客户端请求文件的无效部分。

Changelog

在 0.7 版本加入.

采用可选的 Content-Range 基于以下条件的标题值 length 参数。

参数:
  • length (int | None) --

  • units (str) --

  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.ExpectationFailed(description=None, response=None)

417 Expectation Failed

服务器无法满足Expect请求头的要求。

Changelog

在 0.7 版本加入.

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.ImATeapot(description=None, response=None)

418 I'm a teapot

如果是一个茶壶,有人试图用它煮咖啡,服务器应该返回这个。

Changelog

在 0.7 版本加入.

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.UnprocessableEntity(description=None, response=None)

422 Unprocessable Entity

如果请求格式正确,但指令不正确,则使用。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.Locked(description=None, response=None)

423 Locked

当正在访问的资源被锁定时使用。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.FailedDependency(description=None, response=None)

424 Failed Dependency

如果由于请求的操作依赖于另一个操作而该操作失败,因此无法对资源执行该方法,则使用。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.PreconditionRequired(description=None, response=None)

428 Precondition Required

服务器要求此请求是有条件的,通常是为了防止丢失的更新问题,这是两个或多个试图通过Put或Delete更新资源的客户端之间的竞争条件。通过要求每个客户机包含一个条件头(“if match”或“if unmodified-since”),并从最近的GET请求中保留适当的值,服务器确保每个客户机至少看到了资源的以前版本。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.TooManyRequests(description=None, response=None, retry_after=None)

429 Too Many Requests

服务器限制此用户接收响应的速率,而此请求超过了该速率。(服务器可以使用任何方便的方法来识别用户及其请求率)。服务器可能包含一个“重试后”头,以指示用户在重试前应等待多长时间。

参数:
  • retry_after (datetime | int | None) -- 如果给定,则设置 Retry-After 此值的标头。可能是 int 秒数或 datetime .

  • description (str | None) --

  • response (Response | None) --

返回类型:

None

Changelog

在 1.0 版本发生变更: 补充 retry_after 参数。

exception werkzeug.exceptions.RequestHeaderFieldsTooLarge(description=None, response=None)

431 Request Header Fields Too Large

服务器拒绝处理请求,因为头字段太大。一个或多个单独的字段可能太大,或者所有头的集合太大。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.UnavailableForLegalReasons(description=None, response=None)

451 Unavailable For Legal Reasons

此状态代码表示服务器由于合法请求而拒绝访问资源。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

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

如果应用程序不支持浏览器请求的操作,则引发。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.BadGateway(description=None, response=None)

502 Bad Gateway

如果您在应用程序中进行代理,那么当您从上游服务器接收到一个无效的响应时,您应该返回此状态代码,该服务器在尝试完成请求时访问了该响应。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.ServiceUnavailable(description=None, response=None, retry_after=None)

503 Service Unavailable

如果服务暂时不可用,则应返回状态代码。

参数:
  • retry_after (datetime | int | None) -- 如果给定,则设置 Retry-After 此值的标头。可能是 int 秒数或 datetime .

  • description (str | None) --

  • response (Response | None) --

返回类型:

None

Changelog

在 1.0 版本发生变更: 补充 retry_after 参数。

exception werkzeug.exceptions.GatewayTimeout(description=None, response=None)

504 Gateway Timeout

如果与上游服务器的连接超时,则应返回状态代码。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.HTTPVersionNotSupported(description=None, response=None)

505 HTTP Version Not Supported

服务器不支持请求中使用的HTTP协议版本。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.ClientDisconnected(description=None, response=None)

如果Werkzeug检测到断开连接的客户端,则会引发内部异常。由于此时客户端已经不存在,因此尝试向客户端发送错误消息可能无法工作,最终可能导致服务器中出现另一个异常。这主要是为了让它在默认情况下沉默,就Werkzeug而言。

由于无法可靠地检测到断开,并且WSGI在很大程度上未指定断开,因此,如果客户机不在,则可能会或可能不会引发此问题。

Changelog

在 0.8 版本加入.

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

exception werkzeug.exceptions.SecurityError(description=None, response=None)

在某些事件触发安全错误时引发。否则,这与错误的请求完全相同。

Changelog

在 0.9 版本加入.

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

基本类

所有异常都实现了这个公共接口:

exception werkzeug.exceptions.HTTPException(description=None, response=None)

所有HTTP异常的基类。此异常可以作为WSGI应用程序调用,以呈现默认错误页面,或者您可以独立捕获它的子类并呈现更好的错误消息。

Changelog

在 2.1 版本发生变更: 删除了 wrap 类方法。

参数:
  • description (str | None) --

  • response (Response | None) --

返回类型:

None

__call__(environ, start_response)

将异常作为wsgi应用程序调用。

参数:
  • environ (WSGIEnvironment) -- WSGI环境。

  • start_response (StartResponse) -- wsgi服务器提供的可调用响应。

返回类型:

t.Iterable[bytes]

get_response(environ=None, scope=None)

获取响应对象。如果将一个传递给异常,它将直接返回。

参数:
  • environ (WSGIEnvironment | WSGIRequest | None) -- 请求的可选环境。这可用于根据请求的外观修改响应。

  • scope (dict | None) --

返回:

Response 对象或其子类。

返回类型:

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)

如果 titlebody 表单中缺少,将引发一个特殊的键错误,其行为类似于 KeyError 而且也是 BadRequest 例外。

exception werkzeug.exceptions.BadRequestKeyError(arg=None, *args, **kwargs)

一个异常,用于向 KeyError 和A 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'))
参数:
  • status (int | Response) --

  • args (t.Any) --

  • kwargs (t.Any) --

返回类型:

t.NoReturn

如果要将此功能与自定义异常一起使用,可以创建中止器类的实例:

class werkzeug.exceptions.Aborter(mapping=None, extra=None)

当传递code->exception items的dict时,它可以用作引发异常的可调用项。如果可调用文件的第一个参数是整数,那么将在映射中查找它;如果它是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() 方法。在任何情况下,您都应该查看异常模块的源代码。

可以用 description 参数::

raise BadRequest(description='Request failed because X was not present')