Fancytree抱怨Ajax请求使用Cherrypy返回一个字符串

时间:2014-09-18 18:20:39

标签: ajax json cherrypy fancytree

嗨,我非常擅长使用cherrypy作为fanytree作为前端的后端。

这是代码的fanytree方面:

source: {
   url : '/test_data'
},

在樱桃方面,我实现了一个名为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"}] }]'

所以我看到请求变成了

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

在浏览器上,我看到我的返回对象,但检查失败了:

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

我在某处读到你需要内容类型为json,但我已经拥有了。我错过了什么?

2 个答案:

答案 0 :(得分:1)

内容类型正常,但您返回的字符串无效json(例如,键必须用双引号括起来)。 我建议您将数据准备为dicts列表,然后使用' json.dumps()'转换为JSON。 (也许json_out工具做的相同,但我猜想即使这样你也应该返回一个dicts列表而不是字符串。)

答案 1 :(得分:1)

CherryPy JSON输出工具cherrypy.tools.json_out负责MIME并将您的数据转换为JSON字符串。因此,如果您使用它,该方法应如下所示:

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

否则,如果你想自己做,那就是:

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}] 
  }])

然后确保您已重新启动CherryPy应用,并查看Web开发人员工具或FireBug网络标签以验证响应标头和内容。