Re: Deferred 101
Phil Mayers <[email protected]>
| Newsgroups | gmane.comp.python.twisted.web |
|---|---|
| Message-ID | <[email protected]> |
On 07/05/2011 05:14 AM, [email protected] 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.