Flask send_file正在发送旧文件而不是最新文件

Gug*_*gmi 5 python glob shutil flask

我有一个Flask应用程序,其中使用一个Flask route服务器会创建一个csv文件并将其保存到服务器。使用客户端页面上的生成按钮,将route触发另一个Flask 以获取最新文件,将其移动到tmp文件夹,然后使用将文件发送给用户send_file

现在,当我第一次运行该过程并下载文件时,所有操作都按预期进行。但是,第二次运行该过程时,它将为我提供旧的CSV而不是新生成的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)
Run Code Online (Sandbox Code Playgroud)

如果需要,以下是“生成”下载按钮的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>';
Run Code Online (Sandbox Code Playgroud)

如果我使下载过程变得过于复杂,也请让我知道...

谢谢!!

rit*_*lew 10

send_file具有未配置的缓存超时。除非您告知它不要像这样缓存文件,否则它将发送已缓存的文件:

send_file('./tmp/{}'.format(basename), as_attachment=True, cache_timeout=0)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见以下参考:

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

  • 有没有办法现在取消缓存以前的文件?我通过更改下载网址并添加 ```cache_timeout=0``` 来完成所有工作,但旧链接仍然给我旧文件(新链接允许我更改文件)。 (4认同)