CherryPy HTTPError自定义响应处理(* NOT * HTML)

时间:2017-03-15 17:03:36

标签: cherrypy

我遇到了为cherrypy.HTTPError提供自定义响应处理的问题。我希望在响应主体中显示的唯一内容是JSON编码的dict(这是REST API)。源代码似乎表明HTTPError.set_response()可用于修改cherrypy.response对象...引用此方法中的注释:

修改cherrypy.response状态,标题和正文以表示self。 CherryPy在内部使用它,但您也可以使用它来创建HTTPError对象并设置其输出而不*引发异常。

我已经对HTTPError进行了细分,以便为响应提供自己的主体。我调用基类方法来确保进行任何必要的内务管理。

class APIError(cherrypy.HTTPError):
    def __init__(self, err_resp):
        super().__init__(status=err_resp['error_code'])
        self._api_err_resp = err_resp

    def set_response(self):
        super().set_response()
        response = cherrypy.serving.response
        response.body = json.dumps(self._api_err_resp).encode()

我现在可以毫无问题地调用APIError,但我遇到的问题是,一旦我的自定义错误被提出,CherryPy Web服务器需要大约10-15秒才能响应我的客户端(如果我没有遇到任何延迟)使用HTTPError)。我已经跟踪了源代码,但无法找到延迟的原因。

任何帮助都将不胜感激。

罗布

1 个答案:

答案 0 :(得分:0)

在Python 3.7.2、64位和Windows7上使用cherrypy 16.0.2 子类化HTTPError不会导致异常的等待时间。 也许您应该尝试使用最新版本的cherrypy。

这是我用来测试的代码:

import cherrypy as cp 

class APIError(cp.HTTPError):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self._json_error = kwargs

    def set_response(self):
        super().set_response()
        response = cp.serving.response
        response.body = json.dumps({'error': self._json_error}).encode('utf-8')

此示例要求您使用正确的关键字 status message 调用APIError。对于生产用途,我编写了一个更大的类,在其中传递状态,json数据和其他数据进行记录,然后仅使用状态代码调用super().__init__