Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以将excel文件保存到flask中的内存并从中发送?_Flask - Fatal编程技术网

是否可以将excel文件保存到flask中的内存并从中发送?

是否可以将excel文件保存到flask中的内存并从中发送?,flask,Flask,我想使用openpyxl将excel文件临时保存到内存中,然后将该文件发送到用户的浏览器 假设您有以下flask应用程序: 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

我想使用openpyxl将excel文件临时保存到内存中,然后将该文件发送到用户的浏览器

假设您有以下flask应用程序:

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,
    )

这比您要求的要多一点,但完成了请求。我已经包括了一些额外的内容,从我的结束与发送文件从烧瓶艰难的教训。当把它放在生产uwsgi服务器之后(我使用NGINX和uwsgi来为flask应用程序提供服务)时,底层werkzeug库与uswgi服务器进行了一些协调缓冲。Flask的send_文件有时会对较大的excel文件生成NGINX 500错误。我已经切换到直接使用支持Flask的send_文件的底层werkzeug函数,它不会导致任何服务器问题

这适用于非常大的excel文件吗?正如我目前在《熊猫》杂志上读到的那样,我会大量阅读,然后产生内容,但这需要很长的时间,然后会受到影响timeout@mp252它确实要求立即将整个文件读入内存。因此,在决定支持多大的文件时,内存将是您的限制。