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

Flask中模型预测时的异步处理:股票价格预测Web应用加载优化

Flask异步加载预测图表实现方案

核心思路

把耗时的模型预测逻辑从主请求中拆分,主请求仅生成并返回前两个图表的页面,前端加载完成后异步调用单独的预测接口获取第三个图表数据,再渲染到页面。

1. 调整Flask后端代码

# 首先配置SECRET_KEY,用于模板参数安全序列化,必填
app.config['SECRET_KEY'] = '你自定义的密钥字符串'

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST':
        df = getdf() # 获取用户输入对应的股票数据
        jsonLine, jsonBox = plotGraphs(df)  # 生成前两个图表的json数据
        # 把用户输入的参数传到模板,供后续异步请求使用
        user_params = {
            'stock_code': request.form.get('stock_code'),
            'start_date': request.form.get('start_date'),
            'end_date': request.form.get('end_date')
        }
        # 不执行模型预测逻辑,直接返回前两个图表的页面
        return render_template('chart.html', jsonLine=jsonLine, jsonBox=jsonBox, user_params=user_params)
    return render_template("chart.html")

# 新增单独的预测接口
@app.route('/get-prediction', methods=['POST'])
def get_prediction():
    # 接收前端传的用户参数,重新获取df
    df = getdf() 
    train, valid = buildModel(df)  # 执行耗时的模型预测逻辑
    predictionJson = viz.plotPrediction(train, valid)  # 生成预测图表json
    # 直接返回json格式的预测图表数据
    return predictionJson

2. 修改HTML代码

给预测图表区域添加加载提示,提升用户体验:

<div id="lineChart" class="chart"></div>
<div id="boxPlot" class="chart2"></div>
<div id="prediction" class="chart2">
  <p style="text-align: center; padding: 50px 0;">正在生成预测结果,请稍候...</p>
</div>

3. 调整JavaScript代码

删除原有的预测图表同步渲染逻辑,新增异步请求逻辑:

<script type="text/javascript">
    function drawPlotlyGraph(graph, id) {
        Plotly.plot(id, graph, {});
    }
    // 渲染前两个图表,和原有逻辑一致
    let lineChart = {{ jsonLine | safe}};
    drawPlotlyGraph(lineChart, "lineChart")

    let boxPlot = {{ jsonBox | safe}};
    drawPlotlyGraph(boxPlot, "boxPlot")

    // 页面加载完成后异步请求预测数据
    window.onload = function() {
        // 从模板获取用户参数,组装成表单数据
        const userParams = {{ user_params | tojson | safe }};
        const formData = new FormData();
        for (const key in userParams) {
            formData.append(key, userParams[key]);
        }
        // 发送异步请求
        fetch('/get-prediction', {
            method: 'POST',
            body: formData
        })
        .then(res => res.json())
        .then(predictionData => {
            // 清空原有加载提示,渲染预测图表
            document.getElementById('prediction').innerHTML = '';
            drawPlotlyGraph(predictionData, "prediction");
        })
        .catch(err => {
            document.getElementById('prediction').innerHTML = '<p style="text-align: center; color: red;">预测生成失败,请重试</p>';
            console.error('预测请求出错:', err);
        })
    }
</script>

补充说明

如果你的getdf()方法是直接从request.form获取参数,不需要额外修改,异步请求会把参数按表单格式传递,和原有逻辑完全兼容。

内容的提问来源于stack exchange,提问作者Deep_9289

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:06:01