Как читать мультидикты в питоне - PullRequest
1 голос
/ 14 мая 2019

У меня есть список строк

[
    {'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] также недействительно.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Отправка данных JSON из шаблона во Flask с использованием AJAX с использованием запроса POST:

  • Установка заголовка запроса для типа содержимого JSON.
  • JSON.stringify данныеперед отправкой во Flask.

Получите данные JSON во Flask:

Я показываю пример отправки данных 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>

Выход:

JSON data POST request from template to Flask

Когда пользователь нажимает кнопку Send Data, он отправляет данные JSON из шаблона в приложение Flask.В приложении Flask данные обрабатываются и возвращают обработанные данные в шаблон.

0 голосов
/ 14 мая 2019

Вы должны проанализировать строку данных, полученную из запроса ajax, в json, используя функцию json.loads.Ваш код будет похож на это:

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)

Пожалуйста, найдите этот учебник .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...