2013-02-05 5 views
8

Ich bin neu in Verdrehte und ich versuche, eine einfache Ressource zu schreiben:Mit inlineCallbacks

#code from my ContactResource class 
def render_GET(self, request): 
    def print_contacts(contacts, request): 
     for c in contacts: 
      request.write(c.name) 
     if not request.finished: 
      request.finish() 
    d = Contact.find() #Contact is a Twistar DBObject subclass 
    d.addCallback(print_contacts, request) 
    return NOT_DONE_YET 

Meine Frage ist: Wie kann ich diese Methode ändern, um den inlineCallbacks Dekorator zu verwenden?

Antwort

-2

Edit: Ich habe kein Beispiel gefunden, wie man twisted.web mit inlineCallbacks kombiniert, aber hier sind zwei Vorschläge. Das erste ist vorzuziehen, aber ich bin mir nicht sicher, ob es funktioniert.

@inlineCallbacks 
def render_GET(self, request): 
    contacts = yield Contact.find() 
    defer.returnValue(''.join(c.name for c in contacts) 


@inlineCallbacks 
def render_GET(self, request): 
    contacts = yield Contact.find() 
    for c in contacts: 
     request.write(c.name) 
    if not request.finished: 
     request.finish() 
    defer.returnValue(NOT_DONE_YET) 
+0

Danke für das Beispiel @schlamar, aber es funktioniert nicht. Das wirft "Fehler, der eine Zeichenfolge nicht zurückgegeben hat" Fehler. – user2043932

+0

@ user2043932 Können Sie den vollständigen Stacktrace posten? (z. B. auf http://gist.github.com/) – schlamar

+0

@ user2043932 Bearbeitete meine Antwort. – schlamar

11

A render_GET Verfahren kann kein Deferred zurückzukehren. Es kann nur eine Zeichenfolge oder NOT_DONE_YET zurückgegeben werden. Jede mit inlineCallbacks dekorierte Methode gibt Deferred zurück. Also, dekorieren Sie nicht render_GET mit inlineCallbacks.

Natürlich hält Sie nichts davon ab, eine andere gewünschte Funktion in render_GET aufzurufen, einschließlich einer, die eine Deferred zurückgibt. Werfen Sie einfach die Deferred weg anstatt es von render_GET (natürlich, stellen Sie sicher, dass die Deferred nie mit einem Fehler ausgelöst wird, oder durch Wegwerfen Sie möglicherweise einige Fehler Berichterstattung fehlen ...).

So zum Beispiel:

@inlineCallbacks 
def _renderContacts(self, request): 
    contacts = yield Contact.find() 
    for c in contacts: 
     request.write(c.name) 
    if not request.finished: 
     request.finish() 


def render_GET(self, request): 
    self._renderContacts(request) 
    return NOT_DONE_YET 

ich zumindest empfehlen einen Blick auf txyoga und klein zu nehmen, wenn Sie gehen mit Verdrehte tun jede ernsthafte Web-Entwicklung werden. Selbst wenn Sie sie nicht verwenden möchten, sollten sie Ihnen einige gute Ideen geben, wie Sie Ihren Code strukturieren und verschiedene allgemeine Aufgaben wie diese ausführen können.