cherrypy._cperror模块¶
CherryPy的异常类。
CherryPy提供(并使用)异常来声明HTTP响应应该是默认“200OK”之外的状态。你可以的 raise
它们就像普通的Python异常。您也可以调用它们,它们会自动提升;这意味着您可以设置 HTTPError
或 HTTPRedirect
作为 request.handler
。
重定向帖子¶
当您获得资源并被服务器重定向到另一个位置时,通常没有问题,因为GET既是一个“安全方法”(应该没有副作用),也是一个“幂等方法”(多个调用与一个调用没有什么不同)。
然而,POST既不安全也不幂等--如果你用信用卡充值,你不会想被重定向两次!
因此, none 3xx个响应中的一个允许用户代理(浏览器)在重定向时重新提交帖子,而无需首先与用户确认操作:
300 |
多项选择 |
与用户确认 |
301 |
永久移动 |
与用户确认 |
302 |
找到(临时移动的对象) |
与用户确认 |
303 |
请参阅其他 |
获取新URI;没有确认 |
304 |
未修改 |
仅用于条件GET;POST不应引发此错误 |
305 |
使用代理 |
与用户确认 |
307 |
临时重定向 |
与用户确认 |
308 |
永久重定向 |
没有确认 |
然而,浏览器在历史上实现这些限制的效果很差;特别是,许多浏览器在重定向POST时不会强制用户确认301、302或307。因此,CherryPy缺省为303,大多数用户代理似乎都正确实现了这一点。因此,如果您为POST请求引发HTTPRedirect,用户代理很可能会尝试获取新的URI(不要求用户确认)。我们知道这会让开发人员感到困惑,但这是我们能做的最安全的事情。你当然可以自由筹集资金 HTTPRedirect(uri, status=302)
或者任何其他3xx状态(如果您知道自己在做什么的话),但是考虑到环境,我们不能让这些状态中的任何一个成为默认状态。
自定义错误处理¶

预期的HTTP响应¶
“ERROR_PAGE”配置名称空间可用于为预期响应(如404 Not Found)提供自定义HTML输出。提供将从中读取输出的文件名。内容将使用普通旧式Python使用值%(Status)s、%(Message)s、%(Traceback)s和%(Version)s进行插值 string formatting 。
_cp_config = {
'error_page.404': os.path.join(localDir, "static/index.html")
}
从3.1版开始,您还可以提供一个函数或其他可调用的函数作为ERROR_PAGE条目。它将传递插入到模板中的相同的状态、消息、回溯和版本参数::
def error_page_402(status, message, traceback, version):
return "Error %s - Well, I'm very sorry but you haven't paid!" % status
cherrypy.config.update({'error_page.402': error_page_402})
同样在3.1中,除了编号的错误代码之外,您还可以提供“error_page.default”来处理所有没有自己的ERROR_PAGE条目的代码。
意想不到的错误¶
CherryPy还具有通用错误处理机制:每当代码中出现意外错误时,它都会调用 Request.error_response
若要设置响应状态、标头和正文,请执行以下操作。默认情况下,这与的输出相同 HTTPError(500)
。如果您想提供一些其他行为,通常需要替换“request.error_response”。
以下是一些示例代码,显示如何显示自定义错误消息并发送包含错误的电子邮件:
from cherrypy import _cperror
def handle_error():
cherrypy.response.status = 500
cherrypy.response.body = [
"<html><body>Sorry, an error occurred</body></html>"
]
sendMail('error@domain.com',
'Error in your web app',
_cperror.format_exc())
@cherrypy.config(**{'request.error_response': handle_error})
class Root:
pass
请注意,您必须显式设置 response.body
而不是简单地返回错误消息。
- exception cherrypy._cperror.HTTPError(status=500, message=None)[源代码]¶
基类:
cherrypy._cperror.CherryPyException
用于向客户端返回HTTP错误代码(4xx-5xx)的异常。
此异常可用于使用HTTP状态代码自动发送响应,并带有适当的错误页。它需要一个可选的
status
参数(必须介于400和599之间);默认为500(“内部服务器错误”)。它还需要一个可选的message
参数,将在响应正文中返回。参见 RFC2616 获取可用错误代码的完整列表以及何时使用它们。实例:
raise cherrypy.HTTPError(403) raise cherrypy.HTTPError( "403 Forbidden", "You are not allowed to access this resource.")
- code = None¶
整数HTTP状态代码。
- reason = None¶
HTTP原因短语字符串。
- set_response()[源代码]¶
修改cherrypy.response status、headers和body以表示自己。
CherryPy在内部使用它,但是您也可以使用它来创建一个httpError对象,并在没有 饲养 例外。
- status = None¶
HTTP状态代码。可以是int或str类型(带有原因短语)。
- exception cherrypy._cperror.HTTPRedirect(urls, status=None, encoding=None)[源代码]¶
基类:
cherrypy._cperror.CherryPyException
应重定向请求时引发异常。
此异常将强制HTTP重定向到您提供的URL或URL。必须将新的URL作为第一个参数传递给异常,例如,httpredirect(new url)。列表中允许多个URL。如果URL是绝对的,它将按原样使用。如果它是相对的,则假定它是相对于当前cherrypy.request.path_信息的。
如果提供的URL之一是Unicode对象,则将使用默认编码或传入参数对其进行编码。
有多种类型的重定向,您可以通过
status
参数。如果您不提供status
arg,默认为303(如果使用HTTP/1.0响应,则为302)。实例:
raise cherrypy.HTTPRedirect("") raise cherrypy.HTTPRedirect("/abs/path", 307) raise cherrypy.HTTPRedirect(["path1", "path2?a=1&b=2"], 301)
见 重定向帖子 其他注意事项。
- default_status = 303¶
- encoding = 'utf-8'¶
传递URL时的编码不是本机字符串
- set_response()[源代码]¶
修改cherrypy.response status、headers和body以表示自己。
CherryPy在内部使用它,但是您也可以使用它来创建一个httpRedirect对象,并在没有 饲养 例外。
- property status¶
要发出的整数HTTP状态代码。
- urls = None¶
要发出的URL列表。
- exception cherrypy._cperror.InternalRedirect(path, query_string='')[源代码]¶
基类:
cherrypy._cperror.CherryPyException
为切换到其他URL的处理程序而引发异常。
此异常将把处理重定向到站点内的另一个路径(而不通知客户端)。在引发异常时提供新路径作为参数。在查询字符串中为新的URL提供任何参数。
- exception cherrypy._cperror.NotFound(path=None)[源代码]¶
基类:
cherrypy._cperror.HTTPError
当URL无法映射到任何处理程序(404)时引发异常。
这相当于提高
HTTPError("404 Not Found")
.