flask - 是否可以从烧瓶的内存中保存和发送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)
如何将文件临时保存到内存(而不是像上面的代码那样保存到烧瓶服务器)并从内存发送给用户?
提前谢谢了
解决方案
改成
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 函数,它永远不会导致任何服务器问题。
推荐阅读
- c - 在构建和清理过程中,Microchip ezbl 库中出现错误
- javascript - 使用 Quandl API 中的数据在 Appsmith 表小部件中显示
- python - 为什么文本识别可以在命令行上工作,但不能在 Python 的 postgres 函数中工作?
- arrays - 获取最大数组并将其转换为 C 中的 2x2 数组
- reactjs - 无法将自定义箭头移动到轮播容器外进行反应。(反应响应轮播)
- reactjs - NextJS:我们不能在主页运行 getStaticPaths 吗?
- video - 需要对具有过层的视频项目的帮助
- drupal - 如何使用用户 ID 是自定义 Web 表单字段的视图查看匿名用户的用户特定内容?
- html - 如何将较小的 div 的边框底部放在另一个较大的 div 的边框底部之上?
- javascript - 如何使用 Google Identity API 退出?