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
相关产品推荐
相关产品推荐

