2017-04-30 9 views
0

CherryPyでは、何かがうまくいかない場合はraise cherrypy.HTTPError(code, message)、それがすべてうまくいくと私はreturn stringになります。私自身のHTTP 200結果クラスを作成するには?

私が今探しています何を、私はこれを行うことができるように、私は、クラスを作成する方法を次のとおりです。

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")

+0

をあなたの動機は何?私はチェリーピーの哲学が間違っていると理解しています。とにかく、デコレータを使うことができます。 – webKnjaZ

+0

@webKnjaZ自分のクラスを使用して、常に同じように見える返信を作成できるようにしたいという動機があります(この場合、結果:)。 CherryPyの哲学について詳しく説明してください。どこで間違っていますか? –

+0

なぜそのクラスが必要ですか? CherryPyのZenは簡単です。その場合は – webKnjaZ

答えて

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) 
+0

http://pyvideo.org/pycon-us-2012/stop-writing-classes.html – webKnjaZ

+0

@webKnjaZ素晴らしい話ですが、上記のコードをどのようにリファクタリングすればよいでしょうか? –

+0

私は下の私の答えで投稿したように私はデコレータを使用してお勧めします:http://stackoverflow.com/a/43719569/595220。これを別のモジュールに移動して(例えば、 'utils')、必要に応じて再利用することができます。 – webKnjaZ

-1

__str__メソッドの名前を__repr__に変更してみてください...試みていることがうまくいくと思います。

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' 
関連する問題