我有一个应用程序,该应用程序可以获取一些信息,使用pandas进行一些计算,然后将最终的熊猫数据框转换为CSV,然后使用Flask应用下载。如何在一个视图中下载多个CSV?看来我一次只能返回一个响应。
示例片段:
def serve_csv(dataframe,filename): buffer = StringIO.StringIO() dataframe.to_csv(buffer, encoding='utf-8', index=False) buffer.seek(0) return send_file(buffer, attachment_filename=filename, mimetype='text/csv') def make_calculation(arg1, arg2): '''Does some calculations. input: arg1 - string, arg2- string returns: a pandas data frame''' @app.route('test_app', methods=['GET', 'POST'] def test_app(): form = Form1() if form.validate_on_submit(): calculated_dataframe = make_calculation(str(form.input_1.data), str(form.input_2.data)) return serve_csv(calculated_dataframe, 'Your_final_output.csv') return render_template('test_app.html', form=form)
因此,让我们在上面的示例中说,make_calculation返回了两个pandas数据帧。如何将它们都打印为CSV?
你可以返回一个MIME Multipart响应,一个zip文件或一个TAR球(请注意,链接的RFC有点过时了,但是因为它是HTML格式,所以更容易快速上手;官方的在这里)。
如果你选择进行MIME多部分响应,那么一个不错的起点可能是查看MultipartEncoderand MultipartDecoderin request工具栏;你也许可以直接使用它们,或者至少使用它们的子类/组成来获得所需的行为。可以使用标准库模块来实现Zip文件和TAR球。
一种替代方法是设计你的API,以便你返回JSON,使用标头(或XML元素或JSON字段)指示可以通过其他请求或类似请求获得其他CSV。
这是你使用所需的全部代码Zip files。它将返回一个包含所有文件的zip文件。
Zip files
在我的程序中,我要压缩的所有内容都在一个output文件夹中,因此我只使用os.walk并将其放在zip文件中write。在返回之前,file你需要关闭它,如果不关闭它将返回一个空文件。
output
os.walk
import zipfile import os from flask import send_file @app.route('/download_all') def download_all(): zipf = zipfile.ZipFile('Name.zip','w', zipfile.ZIP_DEFLATED) for root,dirs, files in os.walk('output/'): for file in files: zipf.write('output/'+file) zipf.close() return send_file('Name.zip', mimetype = 'zip', attachment_filename= 'Name.zip', as_attachment = True)
在中,html我简单地称这条路线为:
html
<a href="{{url_for( 'download_all')}}"> DOWNLOAD ALL </a>
我希望有所帮助。