Ваша ошибка использует url_for()
для генерации пути. url_for()
генерирует URL пути, а не пути к файловым системам. Вы не можете использовать результат, чтобы открыть локальный файл. url_for()
используется для отправки браузера в правильное местоположение.
Вы обслуживаете файлы по стандартному пути static
. Просто оставьте выяснение, где находится Flask, объект app
/ current_app
имеет атрибут .static_folder
.
Вы также хотите использовать функцию send_from_directory()
для непосредственного обслуживания файлов. Здесь нет необходимости сначала загружать данные в объект BytesIO()
. send_from_directory
принимает относительный путь в качестве второго аргумента.
Это должно работать:
@app.route('/<string:report>/<string:action>', methods=['GET'])
def report(report, action):
if action == 'download':
files = os.listdir(os.path.join(app.static_folder, 'reports', report))
filename = files[-1]
filepath = os.path.join('reports', report, filename)
return send_from_directory(app.static_folder, filepath, as_attachment=True)
Я пропустил attachment_filename
, потому что по умолчанию уже используется имя файла обслуживаемого файла.
Возможно, вам придется переосмыслить стратегию files[-1]
. os.listdir()
создает файлы в произвольном порядке (в любом порядке ОС выбирает наиболее удобный). Если вы ожидаете, что это будет последний созданный или измененный файл, сначала вам придется выполнить собственную сортировку.