通过烧瓶动态提供羽毛文件

时间:2017-09-28 08:54:32

标签: python pandas flask feather

我正在尝试提供一个基于flask的微服务来公开数据库中的一些数据。在服务器端,数据被预先处理并在被提供之前被放入pandas DataFrame中。

一个选项,简单的选择是将其作为json文件提供。但这很无聊和浪费。我首选的选择是使用羽毛二进制格式。我设法发送羽毛文件,如果它是一个预先存在的文件。问题是,在点击端点时,我无法在调用的函数内调用to_feather()方法,以便能够根据给予端点的参数动态生成数据帧。

from flask import Flask, send_file
import pandas as pd
import feather

app = Flask(__name__)

def generate_df():
    data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
    return pd.DataFrame(data)

@app.route('/serve', methods=['GET'])
def serve():
    return send_file('static.feather', attachment_filename='static.feather')

@app.route('/generate', methods=['GET'])
def generate():
    df = generate_df()
    df.to_feather('dynamic.feather')  # This line is not saving a file
    return send_file('dynamic.feather', attachment_filename='dynamic.feather') 

if __name__ == '__main__':
    app.debug = True
    app.run()

问题是如何强制将羽毛文件的刷新(?)放入磁盘以便能够提供它,或者是否有更好的方法。

1 个答案:

答案 0 :(得分:2)

答案是将羽毛保存到缓冲区而不是磁盘并发送所述缓冲区。通过这种方式,没有必要处理原始问题的路径。这也解决了在同时请求时覆盖临时文件的问题。

from flask import Flask, send_file
from io import BytesIO

import pandas as pd
import feather

app = Flask(__name__)

def generate_df():
    data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
    return pd.DataFrame(data)

@app.route('/generate', methods=['GET'])
def generate():
    df = generate_df()
    feather_buffer = BytesIO()
    feather.write_dataframe(df, feather_buffer)
    feather_buffer.seek(0)
    return send_file(feather_buffer,
                     attachment_filename='dynamic.feather',
                     as_attachment=True)

if __name__ == '__main__':
    app.debug = True
    app.run()