CherryPy 如何返回JSON响应?

21 投票
2 回答
20077 浏览
提问于 2025-04-16 03:42

在我的控制器/请求处理器中,我有以下代码:


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

然后,在我的视图中,我有这个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>";
      }
    }
  );
});

最后,我的问题是。我没有收到任何JSON响应,我不太明白为什么。

其次,有人能简单地解释一下如何在我的控制器/请求处理器中把数据格式化为JSON响应吗?最好是不用任何工具。

2 个回答

46

自从CherryPy 3.2版本开始,它提供了一些工具来处理JSON格式的数据。

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

使用json_out可以把输出的数据转换成JSON格式,并且自动设置正确的内容类型,这样浏览器就知道你发回的数据是什么类型了。

同样,使用@cherrypy.tools.json_in()这个装饰器,可以自动接收和解码JSON格式的POST请求。

14

我不太明白你说的“没有使用工具”是什么意思——Python本身就是一个工具,对吧?

只要使用Python和它的标准库(2.6或更高版本),在你的模块顶部添加

import json

然后把return语句改成

return json.dumps(message)

撰写回答