一尘不染

如何在CherryPy中的POST请求中接收JSON?

json

如何从CherryPy中的POST请求接收JSON?

我去过此页面,尽管它在解释API,其参数及其作用方面做得很好。我似乎无法弄清楚如何使用它们将传入的JSON解析为一个对象。

这是我到目前为止的内容:

import cherrypy
import json

from web.models.card import card
from web.models.session import getSession
from web.controllers.error import formatEx, handle_error

class CardRequestHandler(object):

    @cherrypy.expose
    def update(self, **jsonText):
        db = getSession()
        result = {"operation" : "update", "result" : "success" }
        try:
            u = json.loads(jsonText)
            c = db.query(card).filter(card.id == u.id)
            c.name = u.name
            c.content = u.content
            rzSession.commit()
        except:
            result["result"] = { "exception" : formatEx() }
        return json.dumps(result)

而且,这是我的jquery调用以发布帖子

function Update(el){
    el = jq(el); // makes sure that this is a jquery object

    var pc = el.parent().parent();
    pc = ToJSON(pc);

    //$.ajaxSetup({ scriptCharset : "utf-8" });
    $.post( "http://localhost/wsgi/raspberry/card/update", pc,
            function(data){
                alert("Hello Update Response: " + data);
            }, 
            "json");
}

function ToJSON(h){
    h = jq(h);
    return { 
        "id" : h.attr("id"), 
        "name" : h.get(0).innerText, 
        "content" : h.find(".Content").get(0).innerText
    };
}

阅读 251

收藏
2020-07-27

共1个答案

一尘不染

工作示例:

import cherrypy
import simplejson

class Root(object):

    @cherrypy.expose
    def update(self):
        cl = cherrypy.request.headers['Content-Length']
        rawbody = cherrypy.request.body.read(int(cl))
        body = simplejson.loads(rawbody)
        # do_something_with(body)
        return "Updated %r." % (body,)

    @cherrypy.expose
    def index(self):
        return """
<html>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type='text/javascript'>
function Update() {
    $.ajax({
      type: 'POST',
      url: "update",
      contentType: "application/json",
      processData: false,
      data: $('#updatebox').val(),
      success: function(data) {alert(data);},
      dataType: "text"
    });
}
</script>
<body>
<input type='textbox' id='updatebox' value='{}' size='20' />
<input type='submit' value='Update' onClick='Update(); return false' />
</body>
</html>
"""

cherrypy.quickstart(Root())

链接到的文档介绍了3.2版中的几个CherryPy工具。该json_in工具基本上可以更严格地完成上述操作,并使用3.2中的新主体处理API。

需要注意的重要一件事是,jQuery的post功能似乎无法发送JSON(只能接收JSON)。该dataType参数指定您希望XmlHTTPRequest
接收 的数据类型,而不是它将发送的类型,并且似乎没有可用的参数来指定要发送的类型。ajax()相反,使用可以指定。

2020-07-27