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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.