如何在烧瓶中使用从 ajax 发布的数据?

Posted

技术标签:

【中文标题】如何在烧瓶中使用从 ajax 发布的数据?【英文标题】:how can I use data posted from ajax in flask? 【发布时间】:2013-02-01 06:20:14 【问题描述】:

我在获取从 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);
);

从代码来看,data 是一个类似 javascript 的对象


    'foo' : 'foo',
    'bar' : 'bar',
    'fo_' : 42,

我想在烧瓶中做的是:

@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)

看到,发出了ajax请求但没有提交数据。我用ajax 做console.log(data),所以我可以看到我在jquery 的data 变量中确实有一些有意义的数据。但是 ajax 视图中的 request.form 是空的。我的数据在哪里提交?

【问题讨论】:

JSON.stringify(data) 更改为 data 看看会发生什么。 @Blender 我确实收到了数据。如何以 JSON 格式接收此内容? 你试过request.json吗? @thkang 将其用作数据字符串:"data=" + JSON.stringify(data); 【参考方案1】:

试试

 $.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);
    
);

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

request.json['foo']

由于内容类型被指定为application/json,因此数据在request.json

【讨论】:

一直在寻找这个,request.json['foo'] 为我做了。谢谢:) charset=UTF-8 是诀窍。我找了好几个小时。 是的,当 jquery ajax 设置中没有 contentType 时,Flask request.data 为空【参考方案2】:

根据您的示例,您没有发送键值对,而是将 JSON 字符串分配给 jQuery 数据选项。正如 cmets 中提到的,您必须对 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']
     )

【讨论】:

【参考方案3】:

在烧瓶一侧,使用:

data = request.get_json()

变量数据现在有了您使用 ajax 发送的字典,您现在可以使用 python 对其进行操作

【讨论】:

在连续熬夜 24 小时后编写了该代码。错过了一些东西。我把它收回。它完美地工作。我的错。【参考方案4】:

您是否尝试过删除 contentType?您假设将数据发布到 Flask。

您可以尝试添加虚假数据,例如

data:"hello":"world" 在 ajax 中?只是为了检查 hello world 是否到达 request.form

【讨论】:

【参考方案5】:

从 Ajax (Flask) 获取数据

html

<input type="text" id="inputbox" autocomplete="off">

Js:

    $(document).ready(function()
        $("#inputbox").on("input",function(e)
            inputbox = $("#inputbox").val();
            console.log(inputbox)
            $.ajax(
                method: "post",
                url: "/path",
                data: inputbox,
                success:function(res)


                
            )
        );
    );

.py:

search_value = request.form.get("text")

【讨论】:

以上是关于如何在烧瓶中使用从 ajax 发布的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在烧瓶中获取 AJAX 发布的 JSON? [复制]

如何使用 jquery ajax 正确地将 json 对象传递给烧瓶服务器

如何从烧瓶中接收.js文件上的jsonify变量

如何将 GET 请求从我的烧瓶应用程序发送到另一个站点?

烧瓶如何在ajax调用后重定向到新页面[重复]

如何从烧瓶网页在 python 控制台中打印数据