You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:10:51