Отправка метаданных вместе с фреймом данных с использованием запроса POST запроса POST - PullRequest
0 голосов
/ 06 мая 2019

Я использую запросы питонов для отправки Pandas Dataframe на сервер Flask.Фрейм данных имеет около 2 миллионов строк и 16 столбцов.Я хочу отправить словарь конфигурации вместе с фреймом данных в виде метаданных.В настоящее время я могу отправить фрейм данных в виде файла JSON, однако я не могу найти способ прикрепить метаданные к тому же запросу на публикацию.

Вот мой код:

Клиентская сторона:

 # Post request containing 1. The dataset (pandas df) 2. The metadata (dict)

 dataset = dataset.to_json(orient='split')
 metadata = {'dataset ID': "makis", 'date start': "1", 'date end': "2"}

 url = "http://localhost:8081/upload_dataset"
 r = requests.post(url, data=dataset)
 return r.text

Серверная сторона:

@app.route("/upload_dataset", methods=['POST'])

def upload_dataset():
    from werkzeug.datastructures import FileStorage

    payload = request.stream
    dataset = pd.read_json(payload, typ='frame', orient='split')
    FileStorage(payload).save('dataset.csv')

    return 'File Uploaded & Standing by', 200

1 Ответ

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

После сериализации в json ваш набор данных представляет собой простой текст. Чтобы добавить оттуда больше параметров, ваши единственные опции включают вашу полезную нагрузку вместе с метаданными в отправка параметров , что приводит к кодировке URL-адреса json. Или вставьте свою полезную нагрузку в json post верхнего уровня , таким образом дважды кодируя в json.

Вы получили бы ясность и, возможно, производительность, если бы вместо этого оставили задание кодирования json на requests. Таким образом, вы можете добавлять данные и при этом кодировать / декодировать только один раз.

Пример


dataset = dataset.to_dict(orient='list')
post_data = {'dataset ID': "makis", 'date start': "1", 'date end': "2", 'payload': dataset}
url = "http://localhost:8081/upload_dataset"
r = requests.post(url, json=post_data)

Сторона сервера:

@app.route("/upload_dataset", methods=['POST'])
def upload_dataset():
    post_data = request.get_json()
    ## Use of meta data keys e.g. post_data['date start']
    dataset = pd.from_dict(post_data['payload'], orient='columns')
...