【问题标题】:How do read multiDicts in python (flask)如何在 python (flask) 中读取 multiDicts
【发布时间】:2019-09-30 22:45:38
【问题描述】:

我有一个行列表

[
    {'name': 'John', 'email': 'John@test.com'},
    {'name': 'Jenny', 'email': 'Jenny@yahoo.com'}
]

我正在使用 ajax 从 javascript 发送它们。我不确定如何在 python/flask 中阅读它。我可以在 request.form 中看到数据。当我尝试访问它时,我遇到了问题。

request.form[0] 不给我{'name': 'John', 'email':'John@test.com'}

@app.route('/listusers', methods=['POST'])
def do_listusers():
    for data in request.form:
        print(str(data))
        print(str(data['name']))

数据本身是

[
    {'name': 'John', 'email': 'John@test.com'},
    {'name': 'Jenny', 'email': 'Jenny@yahoo.com'}
]

我期待

{'name': 'John', 'email': 'John@test.com'}

同样data[0] 也无效。

【问题讨论】:

    标签: javascript ajax flask multidimensional-array


    【解决方案1】:

    使用 POST 请求使用 AJAX 将 JSON 数据从模板发送到 Flask:

    • 将请求标头设置为内容类型 JSON。
    • JSON.stringify 发送到 Flask 之前的数据。

    在 Flask 中接收 JSON 数据:

    我展示了一个将 JSON 数据发送到 Flask、在 Flask 中处理并将处理后的数据从 Flask 返回到模板的示例。

    最初 JSON 数据包含一个对象数组:

    [
          {"name": "John", "email": "John@test.com"},
          {"name": "Jenny", "email": "Jenny@yahoo.com"}
    ]
    

    假设我们需要修改此数据以具有id 属性。

    文件夹结构:

    ├── app.py
    └── templates
        └── index.html
    

    app.py:

    from flask import Flask, request, jsonify, render_template
    
    
    app = Flask(__name__)
    
    def get_processed_data(data):
        for i,item in enumerate(data):
            data[i]["id"] = i
        return data
    
    @app.route("/", methods=['GET', 'POST'])
    def login():
        if request.method == "POST":
            request_data = request.get_json()
            processed_data = get_processed_data(request_data)
            return jsonify(processed_data), 200
        return render_template("index.html")
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    

    index.html:

    <html>
    <head>
      <title>Post JSON data using AJAX</title>
    </head>
    <body>
      <h2>
        POST JSON data using AJAX
      </h2>
      <button id="send_data_btn">Send Data</button>
      <script>
      var send_data_btn = document.getElementById("send_data_btn");
      function postData() {
        var request_url = "http://127.0.0.1:5000/";
        var request_payload = [
          {"name": "John", "email": "John@test.com"},
          {"name": "Jenny", "email": "Jenny@yahoo.com"}
        ];
        var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
        xhr.open('POST', request_url);
        xhr.onreadystatechange = function() {
          if (xhr.readyState==4 && xhr.status==200) {
            var processed_data = JSON.parse(xhr.responseText);
            console.log(processed_data);
          }
        };
        xhr.setRequestHeader("Content-type", "application/json");
        xhr.send(JSON.stringify(request_payload));
      }
      send_data_btn.addEventListener("click", postData);
      </script>
    </body>
    </html>
    

    输出:

    当用户点击 Send Data 按钮时,它会将 JSON 数据从模板发送到 Flask 应用程序。在 Flask 应用中,对数据进行处理,并将处理后的数据返回给模板。

    【讨论】:

    • 你们太棒了!
    【解决方案2】:

    您应该使用 json.loads 函数将从 ajax 请求接收到的数据字符串解析为 json。 您的代码将与此类似:

    import json
    data = request.form.getlist('data')
    # data = ["{'name': 'John', 'email': 'John@test.com'}",
    # "{'name': 'Jenny', 'email': 'Jenny@yahoo.com'}"]
    for item in data:
       item_json = json.loads(item)
    

    请找到这个tutorial

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多