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
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
如果用户没有所请求资源的权限,但已通过身份验证,则引发。
- 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 如果资源是“仅查看”。对休息特别有用。
此异常的第一个参数应该是允许的方法列表。严格来说,如果您没有在头中提供有效的方法(您可以使用该列表),那么响应将是无效的。
获取从werkzeug 0.3开始的有效http方法的可选列表,该列表将是必选的。
- 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
引发以表示请求无法完成,因为它与服务器上的当前状态冲突。
Changelog
在 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
如果提交的数据超过给定限制,则应返回状态代码1。
- 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 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
服务器限制此用户接收响应的速率,而此请求超过了该速率。(服务器可以使用任何方便的方法来识别用户及其请求率)。服务器可能包含一个“重试后”头,以指示用户在重试前应等待多长时间。
- 参数:
- 返回类型:
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
如果您在应用程序中进行代理,那么当您从上游服务器接收到一个无效的响应时,您应该返回此状态代码,该服务器在尝试完成请求时访问了该响应。
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.HTTPException(description=None, response=None)¶
所有HTTP异常的基类。此异常可以作为WSGI应用程序调用,以呈现默认错误页面,或者您可以独立捕获它的子类并呈现更好的错误消息。
Changelog
在 2.1 版本发生变更: 删除了
wrap
类方法。
特殊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
和ABadRequest
. 被许多数据结构使用。- 参数:
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)¶
当传递code->exception items的dict时,它可以用作引发异常的可调用项。如果可调用文件的第一个参数是整数,那么将在映射中查找它;如果它是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')