【问题标题】:how can I use data posted from ajax in flask?如何在烧瓶中使用从 ajax 发布的数据?
【发布时间】: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);

标签: jquery python ajax flask


【解决方案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")
      

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 2022-01-25
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多