[Twisted-web] Deferred 101
Phil Mayers
p.mayers at imperial.ac.uk
Tue Jul 5 03:01:04 EDT 2011
On 07/05/2011 05:14 AM, mayvimmer at fibertel.com.ar wrote:
> Hi guys,
> I'm totally new to Twisted although everything I try so far has been a lot of
> fun. I have a really simple situation it seems I cannot wrap my head around.
> Although the tutorial have been really helpful I cannof find how to fix this
> last part.
>
> I created a "login" method that connects with my db through adbapi and
> returns a deferred. I'm using it with pyamf and it's working ok. Now I have to
> implement the same thing but accept logins through a standard web page. I
> followed the Twisted web in 60 seconds tutorial and created a render_POST
> method that processes the login method. The only catch is that I'm returning a
> mako template page. Ok, finally my problem: I cannot make it return the result
> of the deferred: if I debug the response I see a "<Deferred at ...>" but
> not the intended message. Actually if I add a callback method that just prints
> the response, I can get it (but since that prints the message in the log, it
> doesn't help). What am I missing?
The problem is almost certainly that Mako is not deferred-aware. If it
were, it would stop the render when encountering a deferred and re-start
when the deferred callback runs. But if it were, the return value of
it's render method would almost certainly itself be a deferred, which of
course it's not.
Try something this:
def render_POST(self, request):
d = myDeferredMethod()
def render(value):
request.write(template.render(...., value=value))
request.finish()
d.addCallback(render)
return NOT_DONE_YET
i.e. add a callback to the deferred which does the rendering for you
only when the result is available.
FWIF the recently added twisted.web.template handles deferred natively.
More information about the Twisted-web
mailing list