【问题标题】:Flask receiving Post JsonFlask 接收 Post Json
【发布时间】:2016-08-27 17:50:44
【问题描述】:

我正在开发一个烧瓶网络应用程序,其中客户端以以下形式将数据发布到服务器:

{
"sess_id" : 1 ,
"annotations" :
[ {"tag_start" : "TIME","tag_end" : "TIME","tag" : "YOUR_TAG"}, {"tag_start" : "TIME","tag_end" : "TIME","tag" : "YOUR_TAG"}, {"tag_start" : "TIME","tag_end" : "TIME","tag" : "YOUR_TAG"}]
}

这是完整的 Ajax 帖子...

        $.ajax({
            url: 'http://127.0.0.1:5000/api/saveannotation',
            type: 'POST',
            headers: {'Content-Type' : 'application/json'},
            data: {'sess_id' : $('#sessionid_area').val(),
                'annotations': JSON.parse(annotations)},
            success: function(data) { alert(data.status); }
        });

所以我什至可以在 api 端看到这个,它是这样定义的:

@sessionapis.route('/saveannotation', methods=['GET', 'POST'])
@login_required
def save_annotation():
    rData = request.data
    if request.method == 'GET':
        return jsonify({'status' : 'success GET'})
    else:
        return jsonify({'status' : 'success'})

问题是数据是“字节”类型,而不是字典。我也无法调用 request.json 或 request.get_json(silent=True),它返回“400 bad request”。

这是 request.data 中的示例:

b'sess_id=1&annotations%5B0%5D%5Btag_start%5D=2...

由于某种原因,它似乎是 url 编码的。值也是空的。如果我选择做一些疯狂的事情,比如省略 content-type = json;我可以得到类似字典的东西,但我必须非常奇怪地访问它。我没有获得单个对象,而只是对所有属性的平面访问。

关于如何将 json 解析为合理的对象有什么想法吗?

感谢任何提示!

【问题讨论】:

    标签: python json flask


    【解决方案1】:

    仅传递 JSON 的内容类型标头实际上并不会将数据本身转换为 JSON。你要么需要自己做,要么告诉 jQuery 去做。

    $.ajax({
        url: 'http://127.0.0.1:5000/api/saveannotation',
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify({'sess_id' : $('#sessionid_area').val(),
            'annotations': JSON.parse(annotations)}),
        success: function(data) { alert(data.status); }
    });
    

    现在您的数据将采用 JSON 格式,您可以使用 request.get_json() 将其作为 Python dict 获取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2019-12-30
      • 2014-05-26
      • 2018-09-17
      相关资源
      最近更新 更多