CherryPy Как ответить с помощью JSON? - PullRequest
13 голосов
/ 04 сентября 2010

В моем контроллере / обработчике запросов у меня есть следующий код:


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

И, на мой взгляд, у меня есть этот JavaScript:

<code>
$(function() {
  var body = document.getElementsByTagName("body")[0];
  $.ajaxSetup({ 
    scriptCharset : "utf-8",
    contentType: "application/json; charset=utf-8"
  });
  $.post("<a href="http://localhost/wsgi/raspberry/monkey" rel="noreferrer">http://localhost/wsgi/raspberry/monkey</a>", "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 ]

36 голосов
/ 04 сентября 2010

Начиная с 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-пост-запросы.

14 голосов
/ 04 сентября 2010

Не уверен, что вы подразумеваете под "без использования инструментов" - Python является"инструментом", верно?

Используя только Python и его стандартную библиотеку (2.6 или выше), добавьте вверху свой модуль

import json

и измените оператор return на

return json.dumps(message)
...