【问题标题】:CherryPy HTTPError custom response handling (*NOT* HTML)CherryPy HTTPError 自定义响应处理 (*NOT* HTML)
【发布时间】:2017-03-15 17:03:35
【问题描述】:

我在为 cherrypy.HTTPError 提供自定义响应处理时遇到问题。我希望在响应正文中显示的唯一内容是 JSON 编码的 dict(这是 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()

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

任何帮助将不胜感激。

罗伯

【问题讨论】:

  • 确实很奇怪。你找到解决办法了吗?
  • 我也遇到了同样的问题,时间也是如此。问题是 Content-Length 标头设置不正确;设置的长度是回溯,而不是新消息。使用response.headers["Content-Length"] = len(json_error_mesage) 设置标题(其中json_error_mesagejson.dumps() 输出)解决了这个问题。使用返回错误 18 的 CURL 找到它(请参阅 stackoverflow.com/questions/1759956/…

标签: cherrypy


【解决方案1】:

在 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')

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

【讨论】:

    【解决方案2】:

    我让它与这种方法一起工作,这需要 esp。考虑到 jmpcm 关于设置内容长度的评论:

    class APIError(cherrypy.HTTPError):
        def __init__(self, status=500, message=None):
            super().__init__(status=status, message=message)
            self._json_error = json.dumps({'error': message}).encode('utf-8')
        def set_response(self):
            super().set_response()
            response = cherrypy.serving.response
            response.body = self._json_error
            response.headers["Content-Length"] = len(self._json_error)
            response.headers['Content-Type'] = 'application/json'
    
    ``
    

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2021-03-24
      相关资源
      最近更新 更多