2013-02-05 14 views
8

Jestem nowy Twisted i próbuję napisać prosty zasób który wyświetla listę nazwisk z bazy danych, tutaj jest część mojego kodu:Korzystanie 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 

Moje pytanie brzmi: jak mogę zmienić tę metodę, aby korzystać z dekoratora InlineCallbacks?

Odpowiedz

-2

Edycja: Nie znalazłem przykładu jak połączyć twisted.web z inlineCallbacks, ale oto dwie sugestie. Pierwszy jest lepszy, ale nie jestem pewien, czy to działa.

@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

Dzięki za przykład @schlamar, ale to nie działa. Zgłasza błąd "Żądanie nie zwróciło ciągu znaków". – user2043932

+0

@ user2043932 Czy możesz opublikować pełny stacktrace? (np. http://gist.github.com/) – schlamar

+0

@ user2043932 Zmieniono moją odpowiedź. – schlamar

11

render_GET sposób może powrócić Deferred. Może zwracać tylko ciąg znaków lub NOT_DONE_YET. Każda metoda ozdobiona znakiem inlineCallbacks zwróci wartość Deferred. Tak więc możesz nie ozdobić render_GET przez inlineCallbacks.

Oczywiście nic nie stoi na przeszkodzie, aby wywołać dowolną inną funkcję, którą chcesz w render_GET, w tym taką, która zwraca Deferred. Po prostu wyrzuć numer Deferred zamiast zwracać go od render_GET (oczywiście, upewnij się, że Deferred nigdy nie uruchamia się z błędem, lub przez wyrzucenie go może brakować raportów o błędach ...).

Tak więc, na przykład:

@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 

polecam przynajmniej przyjrzeniu txyoga i klein jeśli masz zamiar robić żadnych poważnych tworzenie stron internetowych z skręconych. Nawet jeśli nie chcesz ich używać, powinny dać ci kilka dobrych pomysłów na temat tego, jak możesz ustrukturyzować swój kod i wykonać różne typowe zadania, takie jak ten.