cherrypy._cperror模块

CherryPy的异常类。

CherryPy提供(并使用)异常来声明HTTP响应应该是默认“200OK”之外的状态。你可以的 raise 它们就像普通的Python异常。您也可以调用它们,它们会自动提升;这意味着您可以设置 HTTPErrorHTTPRedirect 作为 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状态(如果您知道自己在做什么的话),但是考虑到环境,我们不能让这些状态中的任何一个成为默认状态。

自定义错误处理

refman/cperrors.gif

预期的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.CherryPyException[源代码]

基类:Exception

Cherrypy异常的基类。

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状态代码。

get_error_page(*args, **kwargs)[源代码]
classmethod handle(exception, status=500, message='')[源代码]

将异常转换为httperror。

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") .

cherrypy._cperror._be_ie_unfriendly(status)[源代码]
cherrypy._cperror.bare_error(extrabody=None)[源代码]

为严重错误生成状态、标题、正文。

在不调用任何其他可疑函数的情况下返回一个三元组,因此应该尽可能无错误。如果在请求之外遇到错误,则从HTTP服务器调用它。

如果Out Body为None,则会在Body中设置友好但相当无用的错误消息。如果OutBody是字符串,它将按原样附加到Body。

cherrypy._cperror.clean_headers(status)[源代码]

删除不应应用于错误响应的所有标头。

cherrypy._cperror.format_exc(exc=None)[源代码]

返回exc(如果没有,则返回sys.exc_info),已格式化。

cherrypy._cperror.get_error_page(status, **kwargs)[源代码]

返回一个HTML页面,其中包含一个非常错误的响应。

状态应为int或字符串。Kwargs将被插入到页面模板中。