CherryPy How to respond with JSON?

bitcycle picture bitcycle · Sep 4, 2010 · Viewed 18.1k times · Source

In my controller/request-handler, I have the following code:


def monkey(self, **kwargs):
  cherrypy.response.headers['Content-Type'] = "application/json"
  message = {"message" : "Hello World!" }
  return message
monkey.exposed = True

And, in my view, I've got this javascript:


$(function() {
  var body = document.getElementsByTagName("body")[0];
  $.ajaxSetup({ 
    scriptCharset : "utf-8",
    contentType: "application/json; charset=utf-8"
  });
  $.post("http://localhost/wsgi/raspberry/monkey", "somePostData",
    function(data) {
      try{
        var response = jQuery.parseJSON(data);
        body.innerHTML += "<span class='notify'>" + response + "</span>";
      }catch(e){ 
        body.innerHTML += "<span class='error'>" + e + "</span>";
      }
    }
  );
});

And finally, here's my problem. I get no JSON response and I'm not sure why.

Secondly, would someone be able to explain how to format data in my controller/request-handler response as a JSON response in the simplest way possible, without using tools?

Answer

fumanchu picture fumanchu · Sep 4, 2010

Since CherryPy 3.2 there are tools to accept/return JSON:

@cherrypy.expose
@cherrypy.tools.json_out()
def monkey(self, **params):
    return {"message": "Hello World!"}

Using json_out serializes the output and sets the appropriate Content-Type header for you.

Similarly decorating with @cherrypy.tools.json_in() can automatically accept/decode JSON post requests.