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

Flask中Session传递DataFrame实现CSV下载报错问题求助

Flask CSV下载中session['data']为None的解决方案

你的报错根源是session['data']未被正确赋值,以下是具体问题和修复步骤:

1. 表单参数名不匹配

HTML表单中,下拉选择框的name属性设置为"select one",但后端用request.form.get('params_b_input')获取参数,导致params_b始终为None,无法进入option_1或option_2分支,自然不会设置session['data']。

修复HTML代码:
修改select标签的name属性为params_b_input:

<select id="params_b_input" class="form-select" aria-label="Default select example" name="params_b_input">
    <option selected value="option_1">Option 1</option>
    <option value="option_2">Option 2</option>
</select>

2. miner_2调用参数名错误

后端option_2分支中,调用miner_2.getData时使用了未定义的变量parameter_a,正确变量名应为params_a,这会导致代码抛出异常,分支执行失败,session['data']未被设置。

修复后端代码:

elif params_b == 'option_2':
    data_result_1 = ''
    # 修正参数名:parameter_a=params_a
    data_result_2 = miner_2.getData(parameter_a=params_a, parameter_c=params_c)
    df = data_result_2['data_frame'].to_json()
    session['data'] = df

3. 增加session数据校验

即使修复上述问题,session仍可能因过期或其他原因丢失数据,建议在下载路由中增加校验,避免直接使用None值。

修复download路由:

@app.route('/download')
def download():
    data = session.get('data')
    if not data:
        abort(400, description="无可用下载数据,请先执行数据采集")
    df = pd.read_json(data) 
    return send_file(
        io.BytesIO(df.to_csv(index=False, encoding='utf-8').encode()),
        as_attachment=True,
        attachment_filename='df.csv',
        mimetype='text/csv')

4. 增强异常处理

在参数解析和API调用环节增加异常处理,避免因参数错误(如params_c无法转为整数)或API调用失败导致流程中断,确保session['data']仅在成功获取数据后赋值。

示例修复result路由:

@app.route("/result", methods = ['POST', 'GET'])
def result():
    params_a = request.form.get('params_a_input')
    params_b = request.form.get('params_b_input')
    
    # 处理params_c的类型转换异常
    try:
        params_c = int(request.form.get('params_c_input'))
    except (ValueError, TypeError):
        return render_template('index.html', main_title=main_title, error="参数C必须为整数")

    data_result_1 = ''
    data_result_2 = ''
    error_msg = ''
    
    if params_b == 'option_1':
        try:
            data_result_1 = miner_1.getData(parameter_a=params_a, params_c=params_c)
            df = data_result_1['data_frame'].to_json()
            session['data'] = df
        except Exception as e:
            error_msg = f"采集数据失败:{str(e)}"
    elif params_b == 'option_2':
        try:
            data_result_2 = miner_2.getData(parameter_a=params_a, parameter_c=params_c)
            df = data_result_2['data_frame'].to_json()
            session['data'] = df
        except Exception as e:
            error_msg = f"采集数据失败:{str(e)}"
    else:
        error_msg = '请选择参数B'
    
    return render_template('index.html', main_title=main_title, 
                           data_result_1=data_result_1, 
                           data_result_2=data_result_2, 
                           error=error_msg)

同时,在HTML模板中添加错误提示展示:

{% if error %}
<div class="alert alert-danger mt-3">
    {{ error }}
</div>
{% endif %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:57:28