CherryPy如何用JSON回复?

bit*_*cle 17 python jquery json cherrypy

在我的controller/request-handler中,我有以下代码:


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

而且,在我看来,我有这个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响应吗?

fum*_*chu 39

从CherryPy 3.2开始,有接受/返回JSON的工具:

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

使用json_out序列化输出并为您设置适当的Content-Type标头.

类似地,装饰@cherrypy.tools.json_in()可以自动接受/解码JSON后置请求.


Ale*_*lli 14

不确定你的意思是"不使用工具" - Python "工具",对吗?

只需使用Python及其标准库(2.6或更高版本),就可以在模块的顶部添加

import json
Run Code Online (Sandbox Code Playgroud)

并将return语句更改为

return json.dumps(message)
Run Code Online (Sandbox Code Playgroud)

  • "工具"是用于"插件"的CherryPy术语.有一个完整的子系统可以使用它们并制作自己的子系统:http://docs.cherrypy.org/dev/intro/concepts/tools.html (6认同)