2013-02-05 9 views
8

Ben Twisted yeniyim ve ben, burada benim bir kod parçası görüntüler bir veritabanından bir isim listesi, basit bir kaynak yazmaya çalışıyorum:kullanma 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 

Sorum şu: inlineCallbacks dekoratörünü kullanmak için bu yöntemi nasıl değiştirebilirim?

cevap

-2

Düzenleme: inlineCallbacks ile twisted.web nasıl birleştirileceğini bir örnek bulamadım, ama burada iki öneri vardır. İlk tercih edilir, ama işe yarayıp yaramadığından emin değilim.

@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

Örnek için teşekkürler @schlamar, ama işe yaramıyor. Bu, "İstek bir dizgi döndürmedi" hatası veriyor. – user2043932

+0

@ user2043932 Tam stacktrace'i yükleyebilir misiniz? (ör. http://gist.github.com/) – schlamar

+0

@ user2043932 Cevabımı düzenledim. – schlamar

11

bir render_GET yöntem Deferred dönmeyebilir. Yalnızca bir dize veya NOT_DONE_YET döndürülebilir. inlineCallbacks ile dekore edilen herhangi bir yöntem bir Deferred döndürecektir. Bu nedenle 'u inlineCallbacks ile dekore edemezsiniz.

Elbette, hiçbir şey, Deferred döndüren bir tane de dahil olmak üzere, render_GET içinde istediğiniz herhangi bir işlevi çağırmaktan sizi durduruyor. Sadece Deferred yerine render_GET'dan geri dönün (Deferred'un hiçbir zaman bir hatayla ateş etmediğinden emin olun, aksi halde bir hata bildirimi eksik olabilir ...).

Yani, örneğin:

@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 

Sana Twisted ile herhangi bir ciddi web geliştirme yapıyor gibi gidiyoruz en az txyoga ve klein bir göz alarak önerilir. Bunları kullanmak istemeseniz bile, kodunuzu nasıl yapılandırabileceğiniz ve bunun gibi çeşitli genel görevleri nasıl gerçekleştireceğiniz konusunda size iyi fikirler vermelidirler.