我有一个flask应用程序,其中服务器使用一个Flask route
创建一个csv文件并将其保存到服务器。使用客户端页面上的生成按钮,将触发另一个烧瓶route
以获取最新文件,将其移动到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)
如果需要,以下是“生成”下载按钮的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>';
也请让我知道我是否在使下载过程复杂化...
谢谢!
答案 0 :(得分:4)
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
答案 1 :(得分:0)
@ritlew 几乎回答了这个问题,添加到他的答案中,添加 cache_timeout=0
后,清除浏览器缓存并在隐身模式下点击 URL。
你也可以试试: