[Twisted-web] web2.server: returning a deferred from IResource.render()

L. Daniel Burr ldanielburr at mac.com
Thu Apr 12 16:12:42 CDT 2007


On Thu, 12 Apr 2007 15:55:36 -0500, ibu <ibu at radempa.de> wrote:

> from twisted.web2 import server, http, resource, channel, http_headers
> from twisted.internet import defer
> class Handler:
>     def __init__(self, request):
>         self.request = request
>     def err(self, e):
>         print "---- errb", e
>     def getResponse(self, result = None):
>         rep = "The output which shall be transferred to the browser."
>         res = http.Response( 200,
>             {'content-type': http_headers.MimeType('text','plain')},
>             rep)
>         print "---- getResponse returning: ", res
>         return res
>     def getDeferredResponse(self):
>         print "---- getDeferredResponse beginning"
>         d = defer.Deferred()
>         d.addCallback(self.getResponse)
>         d.addErrback(self.err)
>         print "---- getDeferredResponse returning: ", d
>         return d

Deferreds don't just automatically schedule themselves to
be fired, they fire in response to some event.  In other
words some event must occur in which d.callback gets
invoked.

Your code, as written, never causes the Deferred's
callback to be fired.

In this example, you'd need to cause the callback to
be invoked yourself, like so:

def getDeferredResponse(self):
     print "---- getDeferredResponse beginning"
     d = defer.Deferred()
     d.addCallback(self.getResponse)
     d.addErrback(self.err)
     print "---- getDeferredResponse returning: ", d
     reactor.callLater(1, d.callback, None)
     return d

Hope this helps,

L. Daniel Burr



More information about the Twisted-web mailing list