pyjamaswithcherrypyjsonrpc edited this page Jun 27, 2010 · 1 revision
  1. summary Pyjamas with CherryPy JSONRPC

JSON-RPC with pyjamas and cherrypy

The following has been tested with pyjamas 0.6 and cherrypy 3.1.

Pyjamas contains an example client in `.../examples/jsonrpc`. You can easily test this example with the following cherrypy script: {{{ import cherrypy import json import os


def jsonrpchdl(): print "before_handler jsonrpc"

  1. note: wheter req.body is a string or file depends on the content-type! req = cherrypy.request try: size = int(req.headers["Content-Length"]) except: size = 1 try: json_string = print "json_string [%s]" % json_string
  2. key = req.params.keys()[0] obj = json.loads(json_string)
  3. log("obj %s" % obj); myparams = {} for key, val in obj.items(): mykey = str(key) myparams[mykey] = val req.params = myparams except: pass = cherrypy.Tool('before_handler',jsonrpchdl)

class Root: @cherrypy.expose def default(self,*args): fname = os.path.join(PYJSDIR,args[0]) print "try to return contents of file %s" % fname f = file(fname) s = return s

@cherrypy.expose def services(self, *args, kwargs): print "echo service" print args print kwargs method = kwargs['method'] f = getattr(self,method) res = f(kwargs['params'][0]) return json.dumps({'id':kwargs['id'],'result':res,'error':None}) def echo(self, text): return text def reverse(self, text): return text[::-1] def uppercase(self, text): return text.upper() def lowercase(self,text): return text.lower()

if __name__ == "__main__": cherrypy.quickstart(Root(),"/", {'global':{'server.socket_port':9000,'log.screen':True}})

}}} The variable PYJSDIR should contain the absolute path to your `.../examples/jsonrpc/output` directory. Now start this script and open in your browser. The `Send to Python Service` button should work as desired.

Lets have a deeper look at this script.

The first method `jsonrpchdl` is later used as a 'before_handler', ie. it called by cherrypy before cherrypy calls our page handler. It reads the json string from the message body and creates the appropriate keyword args used later in our page handler. The line = cherrypy.Tool('before_handler',jsonrpchdl)

registers the handler within cherrypy.

Now follows the published class Root. It contains two exposed methods: `default` works as a default handler, ie. its called by cherrypy if there is no other exposed method which could handle the requested url. We use this method to deliver the static pages (its just to keep the example small, its of course not intended to be used in real code!). The most interesting method in our case is `services`, which has both the expose and the jsonrpc decorators. The `kwargs` array contains our json parameters. This method just uses `getattr` to forward the request to the right method and returns a json result. The latter methods implement the functions used in the pyjamas client.