Можно ли сохранить и отправить файл Excel из памяти в колбу? - PullRequest
0 голосов
/ 29 сентября 2019

Я хочу временно сохранить файл Excel в памяти, используя openpyxl, а затем отправить файл в браузер пользователя.

Допустим, у вас есть следующее приложение для фляги:

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)

Как мне временно сохранить файл в памяти (а не на сервере фляги, как в приведенном выше коде) и отправить его напользователь из памяти?

Большое спасибо заранее

1 Ответ

0 голосов
/ 29 сентября 2019

Изменить на

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.Send_file от Flask иногда генерирует ошибку NGINX 500 с большими файлами Excel.Я переключился на использование базовой функции werkzeug напрямую, которая поддерживает send_file от Flask, и это никогда не приводит к проблемам с сервером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...