Flask中如何将fetchMatches返回的realData变量传递给placePred动作?
解决你的Flask数据传递问题
一、在fixtures.html中把realData传递给placePred动作
先明确核心逻辑:不管你是通过接口请求拿到realData,还是后端直接把数据渲染到模板里,最终都是要把这个完整的变量传给placePred对应的后端动作,这里分两种常用场景给你方案:
场景1:通过表单提交(适合页面刷新式交互)
如果是用表单提交数据,你可以把realData转成JSON字符串存到隐藏字段里,提交时一起传给后端:
<!-- fixtures.html 中的表单代码 --> <form action="{{ url_for('placePred') }}" method="POST"> <!-- 用tojson过滤器把realData转成合法的JSON字符串 --> <input type="hidden" name="real_data" value='{{ realData|tojson }}'> <button type="submit">提交预测</button> </form>
后端placePred函数这样接收:
import json from flask import request @app.route("/placePred", methods=["POST"]) def placePred(): # 取出隐藏字段的JSON字符串,转回数组/对象 real_data = json.loads(request.form.get('real_data', '[]')) # 接下来就可以处理这个数据了 return "数据接收成功,共{}条记录".format(len(real_data))
场景2:通过AJAX异步传递(适合无刷新交互)
如果不想刷新页面,用AJAX异步传递是更好的选择,比如用原生fetch API:
// fixtures.html中的<script>代码 // 先从fetchMatches接口拿到realData fetch('/fetchMatches') .then(response => response.json()) .then(realData => { // 把realData传给placePred接口 fetch('/placePred', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(realData), }) .then(response => response.text()) .then(result => { console.log('传递结果:', result); }); });
后端placePred接收方式更简洁:
from flask import request, jsonify @app.route("/placePred", methods=["POST"]) def placePred(): real_data = request.get_json() # 处理数据后返回响应 return jsonify({"status": "success", "count": len(real_data)})
二、Flask后端中把一个函数的数组传递给另一个函数
后端函数之间传递数组,有几种实用的方法,根据你的业务场景选:
方法1:直接调用函数传参(最直接)
如果两个函数是前后调用的关系(比如fetchMatches生成数组后直接调用placePred处理),直接把数组作为参数传过去就行:
@app.route("/fetchMatches") def fetchMatches(): if g.user: dateBuild = [] wb = xlrd.open_workbook('betDeNoBanter.xlsx') today = datetime.date.today() for sheet in wb.sheets(): dates = sheet.col_values(...) # 你的日期处理逻辑 dateBuild.extend(dates) # 直接调用placePred并传入数组 processed_result = placePred(dateBuild) return processed_result else: return redirect(url_for('login')) # 修改placePred为可接收参数的函数 def placePred(data_array): # 这里写数组处理逻辑,比如过滤今日之后的日期 filtered_dates = [date for date in data_array if date > today] return jsonify(filtered_dates)
如果placePred本身是路由函数,建议把核心处理逻辑抽成单独的工具函数,让两个路由都调用它,避免代码重复:
# 抽离核心处理逻辑 def process_match_dates(data_array): today = datetime.date.today() return [date for date in data_array if date > today] @app.route("/fetchMatches") def fetchMatches(): if g.user: dateBuild = [] # 生成dateBuild的逻辑... processed_data = process_match_dates(dateBuild) return render_template('fixtures.html', realData=processed_data) # ... @app.route("/placePred", methods=["POST"]) def placePred(): data = request.get_json() processed_data = process_match_dates(data) return jsonify(processed_data)
方法2:用Session存储临时数据(适合跨请求传递)
如果两个函数是用户不同请求触发的(比如先访问fetchMatches生成数据,之后再访问placePred处理),可以用Flask的Session来临时存储数组:
import json from flask import session @app.route("/fetchMatches") def fetchMatches(): if g.user: dateBuild = [] # 生成dateBuild的逻辑... # 把数组转成JSON存到Session(Session只能存可序列化对象) session['match_dates'] = json.dumps(dateBuild) return render_template('fixtures.html') # ... @app.route("/placePred") def placePred(): if g.user: # 从Session取出并转回数组 dateBuild = json.loads(session.get('match_dates', '[]')) # 处理数据 return jsonify(dateBuild) # ...
注意:使用Session需要先设置Flask的密钥,在你的app初始化代码里加:app.secret_key = 'your_secure_secret_key_here'
方法3:全局变量(不推荐)
虽然可以用全局变量存数组,但Flask是多线程框架,全局变量会被不同用户的请求覆盖,只有测试或单用户场景才建议用,生产环境绝对别用。
内容的提问来源于stack exchange,提问作者Aviral Srivastava
相关产品推荐
相关产品推荐

