используя flask, отправьте файл второй раз, чтобы получить измененный файл с тем же путем и именем - проблема с кэшированием? - PullRequest
0 голосов
/ 24 января 2020

На нашем flask сайте мы реализовали кнопку «Скачать». Эта кнопка вызывает функцию в flask, которая предоставляет пользователю заархивированный файл с помощью send_file (). В первый раз все отлично работает. После повторного нажатия на кнопку пользователь снова получает тот же файл. Кажется, хорошо, но когда снова нажимается кнопка, файл, который должен отправить flask, изменяется, а старый больше не существует.

Я пытался понять, почему это происходит с отладчиком PyCharm и заметил, что после повторного нажатия кнопки загрузки, процедура загрузки даже не вызывается. Поэтому я думаю, что на заднем плане происходит какое-то кэширование. Я даже удалил файл для отправки из файловой системы, а затем снова нажал кнопку «Загрузить» ... Я получил исходный файл обратно.

Возможно, вы, ребята, испытали нечто подобное и можете помочь мне с вашими знаниями , Заранее спасибо.

Код загрузки:

@app.route('/download/<expID>')
def download(expID):

 experiment = dbc.getExperiment(int(expID))

# only execute, if owner of experiment calls it AND experiment is NOT running or in queue
 if experiment.getOwner() == cas.username and experiment.getStatus() != 1 and experiment.getStatus() != 2:
    ownerPath = dbc.getUser(experiment.getOwner()).getPath()
    fileName = cas.username + "_" + expID

    # remove old zip (if existing)
    try:
        os.remove(experiment.getPath() + "/" + fileName + ".zip")
    except FileNotFoundError:
        pass

    # create zip in owner folder to work around recursion problem
    make_archive(ownerPath + "/" + fileName, 'zip', root_dir=experiment.getPath(), base_dir=None)

    # move from owner folder to owner/experiment folder
    shutil.move(ownerPath + "/" + fileName + ".zip", experiment.getPath() + "/" + fileName + ".zip");

    # trigger download
    return send_file(
        experiment.getPath()+"/"+fileName + ".zip", as_attachment=True)
 return redirect('/dashboard')

Кнопка:

<form action="/download/{{experiments[i][0]}}">
                <input type="submit" id="download" value="download" />
            </form>

1 Ответ

1 голос
/ 24 января 2020

Я нашел решение в документации send_file. Flask действительно кэширует файлы, которые вы отправляете через send_file, и не имеет доступа к функции, которую вы вызывали ранее, в течение определенного времени. Чтобы ограничить это поведение, вы можете использовать аргумент cache_timeout. Для меня это выглядит так:

return send_file(
            experiment.getPath()+"/"+fileName + ".zip", as_attachment=True, cache_timeout=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...