【问题标题】:Sending metadata along with a dataframe using Requests POST request使用 Requests POST 请求发送元数据和数据框
【发布时间】:2019-09-24 01:56:18
【问题描述】:

我正在使用 python 请求将 Pandas 数据帧发送到 Flask 服务器。数据框有大约 200 万行和 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

【问题讨论】:

    标签: python flask python-requests


    【解决方案1】:

    一旦序列化为 json,您的数据集就是纯文本。要从那里添加更多参数,您唯一的选择是将有效负载与元数据一起嵌入post parameters,从而对 json 进行 url 编码。或者将您的有效负载嵌入顶级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')
    

    【讨论】:

    • 是的,效果很好,谢谢:)。小修正:在服务器端第一行是 dataset = pd.DataFrame.from_dict(post_data.get('dataset'), orient='columns'),而在客户端它是 dataset = dataset.to_dict(orient='list ')。至少我是这样让它工作的。谢谢!
    • 抱歉,我没有测试并假设 to_dict 和 to_json 共享相同的 API,但他们似乎没有。我做了修改
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 2016-05-30
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多