2017-04-30 2 views
0

In CherryPy kann ich raise cherrypy.HTTPError(code, message) wenn etwas schief geht, oder ich return string wenn alles klappt.Wie erstelle ich meine eigene HTTP 200-Ergebnisklasse?

Was für jetzt ich suche, ist, wie kann ich eine Klasse zu erstellen, so dass ich das tun kann:

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

Dies schlägt mit dem

TypeError: iteration over non-sequence

Fehler Und ich habe zu verwenden, return str(MyOwnResultClass("f").

+0

Was ist Ihre Motivation ? Ich denke, Sie verstehen die Philosophie von cherrypy falsch. Wie auch immer, du könntest einen Dekorateur benutzen. – webKnjaZ

+0

@webKnjaZ die Motivation ist, dass ich meine eigene Klasse verwenden kann, um eine Antwort zu erstellen, die immer gleich aussieht (in diesem Fall 'Ergebnis: '). Können Sie die CherryPy-Philosophie näher erläutern, wo bekomme ich es falsch? –

+0

Warum brauchen Sie eine Klasse dafür? Zen von CherryPy ist Einfachheit. – webKnjaZ

Antwort

0

tauchte ich ein wenig mehr in die Fehlermeldung, und es scheint, will CherryPy ein iterable Objekt als Rückgabetyp, wenn nicht eine Zeichenfolge.

So ist die Lösung ganz einfach: machen die MyOwnResultClass iterable:

class MyOwnResultClass: 
    foo = None 

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

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

aktualisieren nach dem Vortrag von @webKnjaZ vorgeschlagen zu sehen, ich diese Refactoring:

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

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

+0

@webKnjaZ Tolles Gespräch, wie würde ich den obigen Code umgestalten, um dies zu tun? –

+0

Ich würde vorschlagen, dass Sie Dekorateur verwenden, wie ich in meiner Antwort unten veröffentlicht habe: http://Stackoverflow.com/a/43719569/595220. Sie können es in ein separates Modul (sagen wir "utils") und dann wiederverwenden, wo Sie wollen. – webKnjaZ

-1

Versuchen Sie, Ihre __str__ Methode in __repr__ umzubenennen ... Ich denke, das sollte für das funktionieren, was Sie versuchen.

1

Hier ist, was ich gefunden habe.

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' 
Verwandte Themen