Flask中如何实现点击按钮时才调用模板变量
解决方案
1. 调整Flask后端代码
原路由在页面加载时直接执行select_csv(),导致进入页面就触发调用。我们拆分逻辑,让下载操作单独走一个路由:
from flask import Flask, render_template, request, send_file app = Flask(__name__) # 负责渲染页面,仅加载初始内容,不调用select_csv @app.route("/select", methods=['POST', 'GET']) def select_data(): return render_template('select.html') # 专门处理下载请求,点击按钮时才触发select_csv调用 @app.route("/download", methods=['POST']) def download_csv(): # 获取用户选择的月份参数(按需使用) month_from = request.form.get('Month_From') month_to = request.form.get('Month_To') # 调用select_csv,可传入必要参数 csv_content = select_csv(month_from, month_to) # 返回下载文件,根据实际返回类型调整,示例为BytesIO对象 return send_file( csv_content, as_attachment=True, download_name='subscription_report.csv', mimetype='text/csv' ) # 你的select_csv函数,根据需求调整参数和返回值 def select_csv(month_from=None, month_to=None): # 原有的CSV生成逻辑,比如返回BytesIO对象或文件路径 pass
2. 修改前端HTML代码
让下载按钮所在表单提交到新的/download路由,同时携带用户选择的月份参数:
<form action="/select" method="POST"> <div class="subscription_report"> <label for="Month_From"> Month From </label> <input type="month" id="Month_From" name="Month_From" /> <label for="Month_To"> Month To </label> <input type="month" id="Month_To" name="Month_To" /> <button type="Submit">Submit</button> </div> </form> <img src="static/images/subscription_monthly_report.jpg" width="1250" height="500" /> <table> ...... </table> <!-- 下载表单,提交到/download路由 --> <form action="/download" method="POST"> <!-- 隐藏字段传递用户选择的月份参数 --> <input type="hidden" name="Month_From" value="{{ request.form.get('Month_From', '') }}" /> <input type="hidden" name="Month_To" value="{{ request.form.get('Month_To', '') }}" /> <button type="submit">Download</button> </form>
补充说明
- 如果
select_csv不需要依赖月份参数,可以去掉隐藏字段和路由中的参数获取逻辑 - 确保
select_csv的返回值符合send_file要求:若生成内存数据,用BytesIO包装;若生成本地文件,返回文件路径即可 - 原Submit按钮的逻辑可保留,用于生成页面图表/表格,和下载操作完全解耦
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

