如何创建自己的HTTP 200结果类?

时间:2017-04-30 18:52:00

标签: python cherrypy

在CherryPy中,我可以在出现问题时raise cherrypy.HTTPError(code, message),或者return string当问题全部解决时。{/ p>

我现在正在寻找的是,我如何创建一个类,以便我可以这样做:

class MyOwnResultClass:
   foo = None

   def __init__(self, foo):
      self.foo = foo

   def __str__(self):
      return "Result: {f}".format(f=self.foo)

class cherrypystuff(object):
    @cherrypy.expose
    def index(self):
        return MyOwnResultClass("f")

此操作失败并显示错误

  

TypeError:迭代非序列

我必须使用return str(MyOwnResultClass("f")

3 个答案:

答案 0 :(得分:1)

这就是我想出来的。

from functools import wraps

import cherrypy

RESPONSE_TEMPLATE = 'Result: {res}'

def resultify(original_handler):
    @wraps(original_handler)
    def wrapped_handler(*args, **kwargs):
        orig_resp = original_handler()
        return RESPONSE_TEMPLATE.format(res=orig_resp)
    return wrapped_handler

class CherryPyStuff(object):
    @cherrypy.expose
    @resultify
    def index(self):
        return 'f' 

答案 1 :(得分:0)

我在错误消息中潜入了一点,显然,CherryPy想要一个可迭代对象作为返回类型,如果不是字符串。

因此,解决方案非常简单:使MyOwnResultClass可迭代:

class MyOwnResultClass:
   foo = None

   def __init__(self, foo):
      self.foo = foo

   def __iter__(self):
      yield "Result: {f}".format(f=self.foo)
在看到@webKnjaZ建议的谈话后

更新,我重构了这个:

def MyOwnResult(foo):
    yield "Result: {f}".format(f=foo)

答案 2 :(得分:-1)

尝试将__str__方法重命名为__repr__ ...我认为这应该适用于您尝试的内容。