通过烧瓶动态提供羽毛文件
Serving a feather file dynamically via flask
我正在尝试提供一个基于 Flask 的微服务来公开数据库中的一些数据。在服务器端,数据在被提供之前被预先处理并放入 pandas DataFrame 中。
一个简单的选项是将其作为 json 文件提供。但那是无聊和浪费的。我的首选是使用 feather 二进制格式。如果它是一个预先存在的文件,我设法发送羽毛文件。问题是我无法在到达端点时调用的函数内调用 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()
问题是如何强制将 feather 文件刷新(?)到磁盘以便能够为其提供服务,或者是否有更好的方法。
答案是将羽毛保存到缓冲区而不是磁盘并发送所述缓冲区。这样就不用处理原来的路径问题了。这也解决了在同时请求时覆盖临时文件的问题。
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()
我正在尝试提供一个基于 Flask 的微服务来公开数据库中的一些数据。在服务器端,数据在被提供之前被预先处理并放入 pandas DataFrame 中。
一个简单的选项是将其作为 json 文件提供。但那是无聊和浪费的。我的首选是使用 feather 二进制格式。如果它是一个预先存在的文件,我设法发送羽毛文件。问题是我无法在到达端点时调用的函数内调用 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()
问题是如何强制将 feather 文件刷新(?)到磁盘以便能够为其提供服务,或者是否有更好的方法。
答案是将羽毛保存到缓冲区而不是磁盘并发送所述缓冲区。这样就不用处理原来的路径问题了。这也解决了在同时请求时覆盖临时文件的问题。
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()