Flask接收Post Json

时间:2016-08-27 17:50:45

标签: python json flask

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

{
"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...

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

关于如何将json解析为合理对象的任何想法?

感谢任何提示!

1 个答案:

答案 0 :(得分:2)

仅传递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词典获取。