[Twisted-web] Problem with twisted web and adbapi

Christian Simms christian.simms at gmail.com
Sat Jul 21 09:34:40 EDT 2007


On 7/21/07, S=F8ren Bach Christiansen <sbc at my-place.biz> wrote:
>
> Hi all
>
> I am a new user to the Twisted framework so this might be a trivial
> question, but here goes..
>
> Im trying to use the Web module and adbapi module to create a (rest)
> webservice but I am having problems
> using the adbapi. As fare as I could figure out, the runInteraction
> call spawns a new thread and executes the sql in that, and the
> render_GET  handler is then returning right away -bummer. I need the
> adbapi for its db pool but dont need it to be "blocking" so that I
> can return the result of the db interaction as xml.
>
> Hope you guys can help me out or give me some pointers if I am doing
> this the wrong way.
>
>
> Regards
>    S=F8ren
>
> ----- Code ----
> from twisted.web import server
> from twisted.internet import reactor
> from twisted.enterprise import adbapi
> from xml.dom.minidom import Document
>
> class Simple(Resource):
>      isLeaf=3DTrue
>      def __init__(self,opt):
>          Resource.__init__(self)
>          self.opt=3Dopt
>
>      def render_GET(self,request):
>          doc=3DDocument()
>         self.opt.dbpool.runInteraction(self._getUserList,doc)
>          print "returning result"
>         return doc.toprettyxml(indent=3D"  ")
>
>      def _getUserList(self,txn,doc):
>          txn.execute("SELECT UserName FROM User ")
>          res =3D txn.fetchall()
>          if (res):
>              for row in res:
>                  print row
>                 usr=3Ddoc.createElement("user")
>                 usr.setAttribute("name","%s" % (row[0] ))
>
> class options:
>      pass
>
> if __name__ =3D=3D '__main__':
>      options.dbpool=3D adbapi.ConnectionPool("MySQLdb",
> host=3D'localhost',db=3D'TrackingPresentation',
>                                     user=3D'web', passwd=3D'tingogsager')
>      site =3D server.Site(Simple(options))
>      reactor.listenTCP(8888,site)
>      reactor.run()
>
> ------ Code ------
>
>
>
> _______________________________________________
> Twisted-web mailing list
> Twisted-web at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>

You did all the hard work already.  The only thing you need to do is connect
the database query to the render_GET rendering method's output. You want to
take the Deferred that ruInteraction returns (yes it runs in a separate
thread async), add a callback to it that converts the xml to a string
(called cb below), then return that Deferrred in render_GET.  Here's
untested code:

     def render_GET(self,request):
         doc=3DDocument()
         def cb(PARAM_NOT_USED):
             print "returning result"
             return doc.toprettyxml(indent=3D"  ")
         return self.opt.dbpool.runInteraction
(self._getUserList,doc).addCallback(cb)

If I was writing this code, I would probably have _getUserList create and
return the doc, in which case the code would look like this:

     def render_GET(self,request):
         def cb(doc):  # now doc is passed to the callback from _getUserList
             print "returning result"
             return doc.toprettyxml(indent=3D"  ")
         return self.opt.dbpool.runInteraction
(self._getUserList).addCallback(cb)

Cheers,
Christian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://twistedmatrix.com/pipermail/twisted-web/attachments/20070721/dc=
1cddfc/attachment.htm


More information about the Twisted-web mailing list