【问题标题】:Is it possible to post an object from jquery to bottle.py?是否可以将对象从 jquery 发布到 bottle.py?
【发布时间】:2012-10-10 13:06:26
【问题描述】:

这里是jquery

$.ajax({
    type: "POST",
    url: "/posthere",
    dataType: "json",
    data: {myDict:{'1':'1', '2':'2'}},
    success: function(data){
        //do code
    }
});

这是蟒蛇

@route("/posthere", method="POST")
def postResource(myDict):
    #do code
    return "something"

看起来支持 int、float、path 和 re 的 url 格式……我错过了什么吗?

【问题讨论】:

  • dataType 指定 return 类型,而不是传递的数据类型。
  • ...和data 需要是单级对象(哈希表),而不是分层的。 Reference.

标签: jquery python bottle


【解决方案1】:

线路上只有字节。要发送一个对象,您需要使用某种数据格式对其进行序列化,例如json:

$.ajax({
    type: "POST",
    url: "/posthere",
    data: JSON.stringify({myDict: {'1':'1', '2':'2'}}),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){
        alert(data);
    },
    failure: function(err) {
        alert(err);
    }
});

在接收端,您需要将 json 文本解析为 Python 对象:

from bottle import request, route

@route("/posthere", method="POST")
def postResource():
    #do code
    myDict = request.json['myDict']
    return {"result": "something"}

返回的字典会自动转换为 json。

【讨论】:

    【解决方案2】:

    这可能不那么相关,但简而言之,答案是“否”和“是”。如果您使用的是 jquery 的 data 属性。它实际上会将您的对象转换为字段。类似的东西:

    {
      friend: [1,2,3]
    }
    

    可以这样发送到服务器:

    friend[0]=1&friend[1]=2&friend[2]=3
    

    也就是说,HTTP 实际上并没有定义任何“正确”的方式来向服务器发送数据。 jQuery 这样做是为了让它像客户端发布表单一样工作。所以它正在序列化像formdata这样的数据。

    但这还不是全部!因为您可以随心所欲地发送数据。你可以做一些不同的事情。我不确定是否可以使用 jQuery 发送原始数据。

    您可能想尝试一下:

    $.ajax({
      url: ...,
      data: myObject.toJSON(),
      ...
    })
    

    因为您发送的字符串没有任何定义的字段。您必须在服务器上检查原始数据。将 JSON 字符串转换为 dict 就可以了。

    为了将 json 发送到您的服务器,有一个很棒的东西叫做 jsonrpc。

    http://www.jsonrpc.org/

    不幸的是,我对bottle.py 的了解接近于 0,因此我对如何获取数据无能为力。

    tldr

    将 json 发送到服务器,然后将其解析回 dict,只要您知道如何将其解析回另一端,您就可以发送任何其他内容。 (xml, json, messagepack...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2013-05-31
      • 2019-05-18
      相关资源
      最近更新 更多