2013-02-05 12 views
8

Sono nuovo Twisted e sto cercando di scrivere una semplice risorsa che visualizza un elenco di nomi da un database, ecco una parte del mio codice:Uso 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 

mia domanda è: come posso cambiare questo metodo per usare il decoratore inlineCallbacks?

risposta

-2

Modifica: non ho trovato un esempio su come combinare twisted.web con inlineCallbacks, ma qui ci sono due suggerimenti. Il primo è preferibile, ma non sono sicuro che funzioni.

@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

Grazie per l'esempio @schlamar, ma non funziona. Questo genera l'errore "Richiesta non restituita una stringa". – user2043932

+0

@ user2043932 Puoi pubblicare lo stacktrace completo? (ad esempio su http://gist.github.com/) – schlamar

+0

@ user2043932 Modificato la mia risposta. – schlamar

11

Metodo render_GET non può restituire un Deferred. Può solo restituire una stringa o NOT_DONE_YET. Qualsiasi metodo decorato con inlineCallbacks restituirà un valore Deferred. Pertanto, non è possibile decorare render_GET con inlineCallbacks.

Naturalmente, nulla ti impedisce di chiamare qualsiasi altra funzione desiderata in render_GET, incluso uno che restituisce un Deferred. Basta buttare via il Deferred invece di restituirlo da render_GET (ovviamente, assicurati che lo Deferred non si attivi mai con un errore, o buttandolo via potresti perdere qualche segnalazione di errore ...).

Così, ad esempio:

@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 

Io raccomando almeno dare un'occhiata a txyoga e klein se avete intenzione di fare qualsiasi sviluppo web serio con Twisted. Anche se non vuoi usarli, dovrebbero darti delle buone idee su come puoi strutturare il tuo codice e svolgere varie attività comuni come questa.