Ответ от фляги имеет дополнительный ключ на Json, полученный фронтом React

Итак, у меня есть конечная точка, которая работает примерно так:

from flask import Flask, request, jsonify
from flask_cors import CORS

import json
from werkzeug.utils import secure_filename
import os


from mylib import do_stuff

path = os.getcwd()
UPLOAD_FOLDER = os.path.join(path, 'data')
# #load flask
app = Flask(__name__)
CORS(app)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['JSON_AS_ASCII'] = False



print(UPLOAD_FOLDER,flush=True)
@app.route('/upload', methods=['POST'])
def upload():
    if request.method == 'POST':
        file = request.files['file']
        if file:
            try:
                # Receives a file and saves on the server
                filename = secure_filename(file.filename)
                file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
                print("saving_here {}".format(file_path))
                file.save(file_path)

                # The result here is a dict of dicts of dicts
                # It consists of a dictionary of DataFrames().to_dict()
                result = do_stuff(file_path)


                response = app.response_class(
                    response=json.dumps(result ),
                    status=200,
                    mimetype='application/json'
                )
                return response

            except Exception as e:
                print(e,flush=True)
                return "error"

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port= <PORT>)

Основная проблема здесь в том, что на внешнем интерфейсе иногда я получаю ответ с ключом «сообщение» внутри данных, а иногда я получаю ответ без него (чего я и ожидаю). Неправильный ответ:

"response": {
    "data": {
      "message": "{\"0\": {\"0\": {\"Item\": \"Desinfetante 5L Max Talco Azul\", \"Qtd\": 2, \"UM\": \"GL\", \"Qtd_UM\": \"5L\", \"Qtd_Ttl\": \"10L\"}, \"1\": {\"Item\": \"Caf\\u00e9 A V\\u00e1cuo Tradicional 500G\", \"Qtd\": 10, \"UM\": \"PC\", \"Qtd_UM\": \"500g\", \"Qtd_Ttl\": NaN}}}"
    },
    "headers": {
      "content-type": [
        "application/json"
      ],
      "content-length": [
        "227"
      ],
      "access-control-allow-origin": [
        "*"
      ],
      "server": [
        "Werkzeug/1.0.1 Python/3.8.6"
      ],
      "date": [
        "Fri, 11 Dec 2020 13:16:32 GMT"
      ]
    },
    "status": 200,
    "statusText": "OK"
  }
}

Ожидаемый ответ (только ввод данных):

"response": {
    "data": {
      "0": {
        "0": {
          "Pedido": 997,
          "Qtd": 5,
          "Item": "Água Sanitária 1 Litro",
          "Fornecedor": "YYYY"
        },
        "1": {
          "Pedido": 997,
          "Qtd": 2,
          "Item": "Limpa Vidros Audax Facilita 500ml",
          "Fornecedor": "XXXX"
        }}}

Когда я делаю сообщение непосредственно из python, как в:

import requests
files = {'file': open('<path_to_file>','rb')}
r = requests.post(url = "<url>/upload", files = files)
r.json()
Out[12]: 
{'0': {'0': {'Item': 'Desinfetante 5L Max Talco Azul',
   'Qtd': 2,
   'UM': 'GL',
   'Qtd_UM': '5L',
   'Qtd_Ttl': '10L'},
  '1': {'Item': 'Café A Vácuo Tradicional 500G',
   'Qtd': 10,
   'UM': 'PC',
   'Qtd_UM': '500g',
   'Qtd_Ttl': nan}}}
r.text
Out[16]: '{"0": {"0": {"Item": "Desinfetante 5L Max Talco Azul", "Qtd": 2, "UM": "GL", "Qtd_UM": "5L", "Qtd_Ttl": "10L"}, "1": {"Item": "Caf\\u00e9 A V\\u00e1cuo Tradicional 500G", "Qtd": 10, "UM": "PC", "Qtd_UM": "500g", "Qtd_Ttl": NaN}}}'

Я каждый раз получаю ожидаемый ответ json и не могу воссоздать проблему, с которой я реагирую, даже с теми же файлами и заголовками.

Что пробовали:

  • вернуть json.dumps (результат)
  • вернуть jsonify (результат)
  • вернуть ответ

Вы уверены, что ваш do_stuff(file_path) поступает правильно?

dmitrybelyakov 15.12.2020 16:17

да... Он каждый раз возвращает список, состоящий из словарей. Основная проблема здесь в том, что внешний интерфейс получает ответы как-то иначе, чем приложение Python.

xarles 17.12.2020 17:59

Какой код вы используете для получения данных во внешнем интерфейсе?

Wereii 21.12.2020 13:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
3
343
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что ваши данные ответа имеют \"Qtd_Ttl\": NaN (в неожиданном ответе, который вы получаете), который имеет недопустимый формат в виде строки и не может быть проанализирован в JSON.

Поэтому, если ваши данные имеют допустимое значение для ключа «Qtd_Ttl», вы получите ожидаемый результат, а если значение недействительно, вы получите ответ с ключом message.

Это причина, по которой вы получаете странный формат в своем интерфейсе. Я думаю, вы используете Axios на интерфейсе. Если вы используете Axios, я обнаружил, что это происходит, когда ответ JSON от сервера недействителен, используйте валидатор JSON, например https://jsonlint.com/, чтобы убедиться, что ваш JSON правильно отформатирован.

Сделал fillna перед отправкой ответа и теперь все работает нормально. Большое спасибо!

xarles 04.01.2021 20:01

Другие вопросы по теме