Python flask send_from_directory()

мне нужно написать функцию, которая будет скачивать файлы с сервера и вот все работало отлично когда надо было скачивать по одному файлу я тогда использовал

@app.route('return_files/', methods=['GET','POST'])
def return_files(file)
    return send_from_directory(directory="pdf", filename=file, as_attachment=True)

теперь мне нужно чтобы эта функция возвращала несколько файлов то-есть как-то так:

 @app.route('return_files/', methods=['GET','POST'])
    def return_files(files)
        for file in files:
        return send_from_directory(directory="pdf", filename=file, as_attachment=True)

этот app.route и вся функция выглядит очень абстрактно, суть в том что раньше когда я нажимал на кнопку 'скачать файл' он скачивался, теперь с большим количеством файлов это не проходит, как это можно решить?


Ответы (2 шт):

Автор решения: ClickName

return прерывает выполнение функции с сразу возвращает результат. В вашем случае могу посоветовать два варианта:

  • Завести список и append туда каждый файл.
     @app.route('return_files/', methods=['GET','POST'])
     def return_files(files)
        file_list = []
        for file in files:
            file_list.append(send_from_directory(directory="pdf", 
                             filename=file, 
                             as_attachment=True))
        return file_list
    
  • Написать генератор для получения всех возможных файлов. Читайте про yeld Ну и советую немножко зарефакторить, потому что логика получения файлов, это не логика rout`ов

И да, обратите внимание на комментарий andreymal

→ Ссылка
Автор решения: Sasha

В итоге я решил просто соединить файлы в один и вернуть его.

from PyPDF2 import PdfFileMerger


@app.route('return_files/', methods=['GET','POST'])
    def return_files(files)
        merger = PdfFileMerger()
        for file in files:
            merger.append(file)
        merger.write("result.pdf")
        merger.close()
        return send_from_directory(directory="pdf", filename='result.pdf', as_attachment=True)
→ Ссылка