Колба send_file отправляет старый файл вместо самого нового - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть приложение фляги, в котором при использовании одной колбы route сервер создает CSV-файл и сохраняет его на сервере. Используя сгенерированную кнопку на странице клиента, запускается другая Flask route, чтобы получить самый последний файл, переместить его в папку tmp и отправить этот файл пользователю, используя send_file.

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

Ниже приведен код моего приложения:

from flask import Flask, render_template, flash, redirect, request, url_for, Response, send_file
import os
import time
import shutil
import glob

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'

@app.route('/')
def index():
    return render_template('index.html')


@app.route('/downloadcsv')
def downloadcsv():
    current = os.getcwd()
    try:
        list = glob.glob('{}/*.csv'.format(current))
    except:
        print('No file found')
    basename = os.path.basename(os.path.normpath(max(list, key=os.path.getctime)))
    shutil.move(basename, './tmp/{}'.format(basename))
    return send_file('./tmp/{}'.format(basename), as_attachment=True)

В случае необходимости ниже приведен код JS, который «генерирует» кнопку загрузки:

var download = '<div id="downloadsection" class="container-contact100-form-btn"><a href="/downloadcsv"><button id="download" class="contact100-form-btn"> <span>DOWNLOAD CSV</span></button></a></div>';

Пожалуйста, дайте мне знать, если я слишком усложняю процесс загрузки ...

Спасибо !!

1 Ответ

6 голосов
/ 04 апреля 2019

send_file имеет тайм-аут кэширования, который вы не настраиваете.Он отправит тот же файл, который был кэширован, если вы не скажете ему не кэшировать файл следующим образом:

send_file('./tmp/{}'.format(basename), as_attachment=True, cache_timeout=0)

См. Следующие ссылки для получения дополнительной информации:

http://flask.pocoo.org/docs/1.0/api/#flask.send_file

http://flask.pocoo.org/docs/1.0/api/#flask.Flask.get_send_file_max_age

http://flask.pocoo.org/docs/1.0/config/#SEND_FILE_MAX_AGE_DEFAULT

...