如何使用从ajax发布的数据?

thk*_*ang 59 python ajax jquery flask

我在从jquery ajax发布数据时遇到问题.

$('#clickme').click( function() {
    var data = save_input(); // data

    data['_sid'] = $survey_id;  // survey_id injected from flask
    data['_uip'] = $user_ip; // user_ip injected from flask, request.remote_addr

    $.ajax({
        type : "POST",
        url : "{{ url_for('mod.load_ajax') }}",
        data: JSON.stringify(data),
        contentType: 'application/json;charset=UTF-8',
        success: function(result) {
            console.log(result);
        }
    });

    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

从代码中,data是一个像javascript的对象

{
    'foo' : 'foo',
    'bar' : 'bar',
    'fo_' : 42,
}
Run Code Online (Sandbox Code Playgroud)

我想在烧瓶中做的是:

@mod.route('/load_ajax', methods=["GET", "POST"])
def load_ajax():
    if request.method == "POST":
        # load _sid and _uip from posted JSON and save other data
        # but request.form is empty.
        # >>> request.form
        # ImmutableMultiDict([]) 
        return str(request.form)
Run Code Online (Sandbox Code Playgroud)

请参阅,ajax请求已生成但未提交任何数据.我console.log(data)使用ajax,所以我可以看到我data在jquery 中的变量中确实有一些有意义的数据.但是ajax视图中的request.form是空的.我的数据在哪里提交?

pha*_*tar 66

尝试

 $.ajax({
    type : "POST",
    url : "{{ url_for('mod.load_ajax') }}",
    data: JSON.stringify(data, null, '\t'),
    contentType: 'application/json;charset=UTF-8',
    success: function(result) {
        console.log(result);
    }
});
Run Code Online (Sandbox Code Playgroud)

然后从服务器,您可以像这样引用数据中的变量:

request.json['foo']
Run Code Online (Sandbox Code Playgroud)

由于内容类型是application/json在数据所在的情况下指定的request.json

  • 这是正确的方法 - JSON.stringify. (6认同)
  • `stringify`和`contentType`完成了这项工作,谢谢 (6认同)

Ift*_*han 13

根据您的示例,您不是发送键值对,而是将JSON字符串分配给jQuery数据选项.如你有你的字符串化JSON的评论中提到,创建一个密钥(将用于从烧瓶访问JSON字符串),然后将其分配给jQuery的数据键的对象.

    $.ajax({
            type : "POST",
            url : "{{ url_for('mod.load_ajax') }}",
            data: {json_str: JSON.stringify(data)},
            contentType: 'application/json;charset=UTF-8',
            success: function(result) {
                console.log(result);
            }
        });

    @mod.route('/load_ajax', methods=["GET", "POST"])
    def load_ajax():
        if request.method == "POST":
            # load _sid and _uip from posted JSON and save other data
            # but request.form is empty.
            # >>> request.form
            # ImmutableMultiDict([]) 
            return str(request.form['json_str']
     )
Run Code Online (Sandbox Code Playgroud)