Как заставить python выход сохранен в виде файла Excel? - PullRequest
0 голосов
/ 08 января 2020

У меня есть скрипт python, работающий на сервере. в результате он создает книгу Excel с использованием библиотеки openpyxl, и я записываю ее на диск с помощью библиотеки tempfile в файле tempfile на диске серверов. Но на этом этапе я хочу, чтобы браузер клиента также загружал рабочую книгу. что мне делать?

Это мой код:

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file:# and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            output = gen_file(file)
            #gen_file makes a new excel workbook from the uploaded file
            return output
    return '''
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form action="" method=post enctype=multipart/form-data>
      <p><input type=file name=file>
         <input type=submit value=Upload>
    </form>
    '''

и это последняя часть моей функции gen_file

    with NamedTemporaryFile(suffix=".xlsx",dir=".",delete=False) as tmp:
        output_workbook.save(tmp)
        return tmp.name

1 Ответ

0 голосов
/ 08 января 2020

Если вы используете flask, вы можете либо отправить файл прямо из приложения flask, либо использовать балансировщик нагрузки, например nginx, и поместить файлы в nginx publi c. directory.

Для первого варианта вы можете использовать что-то вроде следующего:

from flask import Response

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file:# and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            output = gen_file(file)
            #gen_file makes a new excel workbook from the uploaded file
            file_content = open(output, 'r').read()
            return Response(
                file_content,
                mimetype="text",
                headers={"Content-disposition":
                    f"attachment; filename=anything.csv"})

<file_content> может быть любым. Вы можете читать содержимое файла, используя встроенные функции python, такие как open.

...