On 07/05/2011 05:14 AM, mayvimmer@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 "
" 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.