[Twisted-Python] How to return a meaningful response to an AMP command when deferreds are involved?

Jean-Paul Calderone exarkun at divmod.com
Wed Apr 2 15:10:05 EDT 2008


On Wed, 2 Apr 2008 13:05:49 -0600, Nathan <nathan.stocks at gmail.com> wrote:
>On my AMP server I'm using twisted.enterprise to query a postgres
>database and do inserts.  I'd like to return whether the insert
>succeeded or failed as the response to the AMP responder function --
>is there an established pattern for doing things like that?

If a responder returns a Deferred, then the result of the Deferred is
taken as the response to the request.

>
>So basically, with the amp command:
>
>class MyInsert(amp.Command):
>   arguments = [('an_int',amp.Integer())]
>   response = [('succeeded',amp.Boolean())]
>
>....on the client I do:
>
>amp_client.callRemote(MyInsert, an_int)
>
>...on the server:
>
>@MyInsert.responder
>def my_insert(self, an_int):
>   qry_def = self.dbpool.runOperation("insert into mytable the_number
>values (%d);" % an_int)
>   qry_def.addCallback(self._my_insert_ok)
>   qry_def.addErrback(self._my_insert_err)
># Here's the AMP response...but I don't KNOW whether it succeeded yet!
># ...but I've _got_ to return a response dict  from this function or
>AMP gives an error!
>   return {'succeeded':True}

Don't return that dict here.  Return qry_def, instead.  Make your callbacks
return dicts or raise exceptions to indicate the result.

Jean-Paul




More information about the Twisted-Python mailing list