[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 13:10:05 MDT 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