如何从烧瓶中的'ImmutableMultiDict'获取数据

时间:2015-03-17 03:59:06

标签: jquery python ajax flask

我正在学习如何使用ajax和Flask,所以我做的是发送一个ajax请求,并在我的python文件中以post请求接收数据

My html file contains this code

var data = {"name":"John Doe","age":"21"};
$.ajax({
  url:'/post/data',
  datatype : "json",
  contentType: "application/json; charset=utf-8",
  data : JSON.stringify(data),
  success : function(result) {
    jQuery("#clash").html(result); 
  },error : function(result){
     console.log(result);
 }
});

我的python文件包含:

@app.route('/post/data',methods=['GET','POST'])
def postdata():
  #do some
  data = str(request.args)
  json_dumps = json.dumps(data)
  return json_dumps

这为我提供了页面上的以下数据

"ImmutableMultiDict([('{\"name\":\"John Doe\",\"age\":\"21\"}', u'')])"

这就是我的request.query_string看起来{%22name%22:%22John%20Doe%22,%22age%22:%2221%22}

那么如何获得nameage。如果我在任何地方都错了,请纠正我。谢谢。

4 个答案:

答案 0 :(得分:17)

您实际上并不需要从ImmutableMultiDict获取数据。你所拥有的一些错误阻止你将响应作为json数据拉出来。首先,您必须稍微调整ajax调用的参数。您应该将呼叫类型添加为POST。此外,datatype应拼写为dataType。你的新电话应该是:

var data = {"name":"John Doe","age":"21"};
$.ajax({
    type: 'POST',
    contentType: 'application/json',
    url: '/post/data',
    dataType : 'json',
    data : JSON.stringify(data),
    success : function(result) {
      jQuery("#clash").html(result); 
    },error : function(result){
       console.log(result);
    }
});

现在,数据实际上是作为json类型的发布请求发送的。在Flask服务器上,我们现在可以将数据作为子信息读取如下:

@app.route('/post/data',methods=['GET','POST'])
def postdata():
    jsonData = request.get_json()
    print jsonData['name']
    print jsonData['age']
    return "hello world" #or whatever you want to return

这将成功打印John Doe21

如果这对你有用或者你有任何其他问题,请告诉我!

编辑:您可以将成功返回到来自flask的ajax调用,如下所示:

# include this import at the tomb
from flask import jsonify

@app.route('/post/data',methods=['GET','POST'])
    def postdata():
        ...
        return jsonify(success=True, data=jsonData)

答案 1 :(得分:5)

我来到这个页面是因为我试图用AJAX发送表单,我终于找到了解决方案。解决方案是跳过JSON(希望这会帮助其他人进行相同的搜索):

$.ajax({
    type: "POST",
    url: my_url,
    data: $("#formID").serialize(), //form containing name and age
    success: function(result){
        console.log(result);
    }
});

然后,在Flask服务器上:

app.route('/my_url', methods = [POST])
def some_function():
    name = request.form['name']
    age = request.form['age']
    # do what you want with these variables
    return 'You got it right'

答案 2 :(得分:2)

只需在request.form对象上调用to_dict,例如http://www.seanbehan.com/how-to-get-a-dict-from-flask-request-form/

答案 3 :(得分:0)

我通过像这样将contentType添加为application / JSON来解决了问题

data ={ 
              type:'POST',
              contentType:'application/json',
              otherData: 'foo'
           }

您现在可以像这样访问烧瓶后端中的数据:

app.route('/my_url', methods = [POST])
def some_function():
    other_data = request.form['otherData']
    # do something

注意:我为此使用了JavaScript而不是jQuery