是否可以保存到烧瓶中的内存并从中发送Excel文件?

时间:2019-09-28 22:07:08

标签: flask

我想使用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服务器),然后从内存发送给用户?

非常感谢

1 个答案:

答案 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函数,它永远不会导致任何服务器问题。