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

Posted

技术标签:

【中文标题】如何从烧瓶中的“ImmutableMultiDict”获取数据【英文标题】:how to get data from 'ImmutableMultiDict' in flask 【发布时间】:2015-05-19 09:47:45 【问题描述】:

我正在学习如何使用 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("#***").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。如果我在任何地方错了,请纠正我。在此先感谢。

【问题讨论】:

使用request.json.get('name') 【参考方案1】:

您实际上不需要从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("#***").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

让我知道这是否适合您或如果您有任何其他问题!

编辑:您可以从烧瓶中返回成功到 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)

【讨论】:

此方法工作正常.. 数据根据我的需要在 python 文件中接收,但在 ajax 中它返回到error 函数。 你的函数返回了什么?我会给你一个解决方案。基本上,你希望函数返回什么,你希望#*** 显示什么? 好的,我明白了。我应该从我的函数作为一些数据(Json)返回到 ajax,这样它就会成功接收,否则只会出错。谢谢你的帮助 是的,只是在答案中添加了正确的方法。 这里要注意的是,除了dataType 之外,您始终需要在ajax 请求中指定contentType。 ***.com/questions/14322984/…【参考方案2】:

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

【讨论】:

这是我需要的答案。【参考方案3】:

我来到这个页面是因为我正在尝试使用 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'

【讨论】:

【参考方案4】:

我通过像这样将 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

【讨论】:

以上是关于如何从烧瓶中的“ImmutableMultiDict”获取数据的主要内容,如果未能解决你的问题,请参考以下文章

从烧瓶中的文件存储对象中提取文件

如何在不使用请求的情况下直接从代码调用烧瓶端点

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

从烧瓶中的 PostgreSQL 函数提交事务

如何将数据从烧瓶发送到 html 模板

如何将烧瓶端口从容器发布到主机[重复]