我在为 提供自定义响应处理时遇到问题cherrypy.HTTPError。我想要在响应正文中显示的唯一内容是 JSON 编码的字典(这是 REST API)。源代码似乎表明HTTPError.set_response()可以用来修改cherrypy.response对象...引用这个方法中的注释:
修改cherrypy.response状态、标题和正文以代表自身。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()
Run Code Online (Sandbox Code Playgroud)
我现在可以APIError毫无问题地调用,但我遇到的问题是,一旦出现自定义错误,CherryPy Web 服务器大约需要 10-15 秒才能响应我的客户端(如果我使用,我不会遇到任何延迟HTTPError)。我追踪了源代码,但找不到延迟的原因。
任何帮助,将不胜感激。
抢
在 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')
Run Code Online (Sandbox Code Playgroud)
此示例要求您使用正确的关键字status和message来调用 APIError 。对于生产使用,我编写了一个更大的类,在其中传递状态、json 数据和其他数据进行日志记录,然后super().__init__仅使用状态代码调用。