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

How to create my own HTTP 200 result class?

在 CherryPy 中,当出现问题时我可以 raise cherrypy.HTTPError(code, message),或者当一切正常时我可以 return string

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

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: iteration over non-sequence

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

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

这是我的想法。

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' 

我更深入地研究了错误消息,显然,CherryPy 想要一个 return 类型的可迭代对象,如果不是字符串的话。

因此,解决方案非常简单:使 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)