Flask应用程序|渲染模板,然后开始自动下载



我创建了一个Flask应用,它接收一个输入文件,提取内容,将其转换为另一种格式,并返回一个包含转换内容的压缩文件。

@app.route('/', methods=['GET', "POST"])
@app.route('/home', methods=['GET', "POST"])
def home():
form = UploadFileForm()
file = form.file.data
if form.validate_on_submit():
file.save(os.path.join(os.path.abspath(os.path.dirname(__file__)), app.config['UPLOAD_FOLDER'], secure_filename(
file.filename)))
# 1. unzip files in directory
unzip(file.filename)
# 2. starts conversion process
conversion_status = converter().failed_files
# 3. compress generated DICOM files into export .zip file
zip_dir("static/results/conversion")
# 4. routes to downloading page with corresponding download action
return redirect(url_for('download'))
return render_template('index.html', form=form)

到目前为止一切正常。目前,我正在步骤4中路由到另一个函数,该函数会呈现一个结果页面,告知转换是否正常。它还打印导出文件,通过单击这些文件,可以下载。

@app.route('/download')
def download():
return render_template('download.html', files=os.listdir('static/results/export'), status=conversion_status)
@app.route('/download/<filename>')
def download_file(filename):
return send_from_directory('static/results/export', filename)

因为我在azure web应用程序url上运行该应用程序,所以我想将流程更改为:

  1. 呈现结果页面
  2. 之后自动下载内容,无需用户输入

像这样:

return render_template('download.html', files=os.listdir('static/results/export'), status=conversion_status)
return send_from_directory('static/results/export', filename)

但我不知道如何在之后呈现两个东西

在一个端点内连续呈现两个内容是不可行的
但是,也可以使用JavaScript自动下载该文件。

要在文件列表中查找当前结果,可以将名称作为参数传递给结果的端点。

return redirect(url_for('download', f=filename))

在端点中,您需要这个参数,并将它与找到的文件列表一起传递给模板。您可以使用简单的比较来识别文件,并使用属性将要下载的锚点标记为最新。

@app.route('/download')
def download():
current = request.args.get('f')
files = os.listdir('static/results/export')
return render_template('download.html', **locals())
<ul>
{% for file in files -%}
<li>
<a
class="{{ ('', 'dwl-current')[current and current == file] }}"
href="{{ url_for('download_file', filename=file) }}"
download
>{{file}}</a></li>
{% endfor -%}
</ul>

如果您添加锚来运行下载,现在可以自动单击它。

<script type="text/javascript">
(() => {
const elem = document.querySelector('a.dwl-current');
elem && elem.click();
})();
</script>

相关内容

最新更新