![](https://secure.gravatar.com/avatar/dc475ae46eb8f1d6d78305610dda5298.jpg?s=120&d=mm&r=g)
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? Here's some code to help me explain my problem: class Login(Resource): """LogIn post processing""" isLeaf = True def render_POST(self, request): rsp = None errc = None usr = User() username = cgi.escape(request.args['username'][0]) passwd = cgi.escape(request.args['passwd'][0]) try: # here I get the answer of the process. I would expect the login # message but instead I get a deferred repr object. rsp = usr.login(request, username, passwd) except Exception, e: errc = e.args[0] # this should return the contents of postproc.mak (a regular file) # but with certain keywords replaced. request.write(serve_tpl('postproc.mak', **{'status':rsp, 'username':username, 'errorcode':errc})) request.finish() return NOT_DONE_YET class Userobject): def login(self, request, username, password): rp = defer.Deferred() def cb(rs): resp = u'Unidentified reason' if len(rs)==0: resp = u'No account exists for the given username' elif rs[0]['password'!=password: resp = u'Password does not match' else: resp = u'Ok' rp.callback(resp) def eb(failure): rp.errback(failure) d = self.conn_pool.runQuery('select password from user where ' 'username=?', (username,)) d.addCallback(cb).addErrback(eb) return rp TIA, Eduardo Miguez
![](https://secure.gravatar.com/avatar/426d6dbf6554a9b3fca1fd04e6b75f38.jpg?s=120&d=mm&r=g)
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 "<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.
participants (2)
-
mayvimmer@fibertel.com.ar
-
Phil Mayers