首页 > 解决方案 > 是否可以从烧瓶的内存中保存和发送excel文件?

问题描述

我想使用 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

解决方案


改成

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 来为烧瓶应用程序提供服务),底层 werkzeug 库与 uswgi 服务器进行了一些协调的缓冲。Flask 的 send_file 有时会在使用较大的 excel 文件时生成 NGINX 500 错误。我已经切换到直接使用支持 Flask 的 send_file 的底层 werkzeug 函数,它永远不会导致任何服务器问题。


推荐阅读