【问题标题】:CherryPy How to respond with JSON?CherryPy 如何用 JSON 响应?
【发布时间】:2011-04-08 03:32:24
【问题描述】:

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


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("@987654321@", "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 响应?

【问题讨论】:

  • 你知道 CherryPy 提供了一个用于暴露函数的装饰器吗?只需将@cherrypy.exposed 放在def monkey... 上方的行上
  • 注意正确的装饰器现在是@cherrypy.expose

标签: jquery python json cherrypy


【解决方案1】:

不确定“不使用工具”是什么意思——Python “工具”,对吧?

仅使用 Python 及其标准库(2.6 或更高版本),在模块顶部添加

import json

并将return 语句更改为

return json.dumps(message)

【讨论】:

  • 在 Python 2.5 中,您可以使用 simplejson 包。
  • 实际上,我所说的“没有工具”的意思是没有使用装饰器。我仍然习惯于 python 的特质。是的,我已经看到使用 simplejson,但我希望能够先使用基础库来做到这一点。
  • @Sean, simplejson 只是 json 的旧版本,在后者被并入 Python 标准库之前。 IOW,json 并不比simplejson 更“基础”,它只是 PSF 的“打包”决定(特别是 Python 本身的核心开发人员和与之配套的标准库)。
  • “工具”是 CherryPy 的“插件”行话。有一个完整的子系统可以使用它们并自己制作:docs.cherrypy.org/dev/intro/concepts/tools.html
  • 使用这种方法,您需要调用cherrypy.response.headers['Content-Type'] = 'application/json' 来设置正确的内容类型。但是你应该改用@cherrypy.tools.json_out()
【解决方案2】:

自 CherryPy 3.2 以来,有接受/返回 JSON 的工具:

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

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

同样用@cherrypy.tools.json_in()装饰可以自动接受/解码JSON post请求。

【讨论】:

猜你喜欢
  • 2017-03-26
  • 2011-06-11
  • 2011-03-05
  • 1970-01-01
  • 2015-08-14
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多