2017-04-30 19 views
0

在CherryPy中,當出現問題時,我可以raise cherrypy.HTTPError(code, message),或者當我全部解決問題時,我可以。如何創建我自己的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

什麼是你的動機?我認爲,你明白cherrypy的哲學是錯誤的。無論如何,你可以使用裝飾器。 – 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'