我想使用openpyxl将excel文件临时保存到内存中,然后将文件发送到用户的浏览器。
假设您有以下烧瓶应用程序:
from flask import send_file
from openpyxl import Workbook
@app.route('/page', methods=['GET', 'POST'])
def func():
wb = Workbook()
ws=wb.create_sheet()
ws['A1'] = 'Hello World'
filename = 'helloworld.xlsx'
wb.save(filename)
wb.close()
return send_file(filename)
我如何将文件临时保存到内存(而不是像上面的代码那样保存到flask服务器),然后从内存发送给用户?
非常感谢
答案 0 :(得分:0)
更改为
import io
from flask import Response
from xlsxwriter import Workbook
from werkzeug import FileWrapper
@app.route('/page', methods=['GET', 'POST'])
def func():
file = io.BytesIO()
wb = Workbook(file)
ws = wb.add_worksheet()
ws.write('A1', 'Hello World')
wb.close()
file.seek(0)
wrapped_file = FileWrapper(file)
return Response(
wrapped_file,
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
direct_passthrough=True,
)
这比您要求的要多,但可以完成请求。从Flask发送文件的最后,我总结了一些艰难的课程中的其他内容。当将它放在生产uwsgi服务器后面时(我正在使用NGINX和uwsgi服务flask应用程序),底层的werkzeug库使用uswgi服务器进行了一些协调的缓冲。 Flask的send_file有时会使用较大的excel文件生成NGINX 500错误。我已经切换到直接使用支持Flask的send_file的基础werkzeug函数,它永远不会导致任何服务器问题。