Search code examples
ajaxjsoncherrypyfancytree

Fancytree complains Ajax request returned a string using Cherrypy


Hi I am very new to use cherrypy as backend with fanytree as front end.

here is my fanytree side of the code:

source: {
   url : '/test_data'
},

on the cherrypy side, I implemented function called test_data

@cherrypy.expose
@cherrypy.tools.json_out()
def test_data(self, **kwargs):
  cherrypy.response.headers["Content-Type"] = "application/json"
  return '[ {"title":"abc", "folder": true, "key": "1", "children":[ {"title":"b","key":"2"}] }]'

So I see the request comes to cherrypy as

'GET /test_data?_=some number...

On browser I see my return object back but it failed on check:

if (typeof data === "string") {
      $.error("Ajax request returned a string (did you get the JSON dataType wrong?).");
 }

I read somewhere that you need content-type to be json but I already have. What am I missing?


Solution

  • CherryPy JSON output tool, cherrypy.tools.json_out, takes care of MIME and turning your data into a JSON string. So if you use it the method should look like:

    @cherrypy.expose
    @cherrypy.tools.json_out()
    def test_data(self, **kwargs):
      return [{
        "title"    : "abc", 
        "folder"   : True, 
        "key"      : 1, 
        "children" : [{"title": "b", "key": 2}] 
      }]
    

    Otherwise if you want to do it yourself it'll be:

    import json
    
    @cherrypy.expose
    def test_data(self, **kwargs):
      cherrypy.response.headers["Content-Type"] = "application/json"
      return json.dumps([{
        "title"    : "abc", 
        "folder"   : True, 
        "key"      : 1, 
        "children" : [{"title": "b", "key": 2}] 
      }])
    

    Then make sure you've restarted CherryPy app, and look in web developer tools or FireBug network tab to verify response headers and content.