Streamlit多页应用:未加载数据时跨页访问DataFrame的错误处理
解决Streamlit多页应用数据缺失报错问题
问题场景与报错说明
- 多页应用结构:「HomePage」负责配置数据生成DataFrame,「DataPlotPage」基于该数据绘制图表
- 触发错误:用户未在主页选择数据方式就进入绘图页时,抛出
TypeError: 'NoneType' object is not subscriptable - 预期效果:此时显示提示信息「Data is missing, kindly load the data in first page」
错误原因
主页的getrecord()函数存在逻辑缺陷:
- 当用户未选择任何选项(
mydataset为None)时,函数无返回值,df为None - 选择「Upload dataset」分支时,仅定义了
df2但未返回,同样导致df为None - 上述情况会使
st.session_state["df"]存储None,绘图页直接访问会触发类型错误
解决方案
1. 修正主页代码
- 完善
getrecord()函数,确保所有分支都返回有效DataFrame或明确的标识值 - 仅当用户选择了数据方式后,才将数据存入session state
2. 优化绘图页代码
- 先校验
st.session_state["df"]是否存在且有效 - 无效时显示提示信息,有效时再执行绘图逻辑
完整修正代码
HomePage(pages/HomePage.py)
import pandas as pd import streamlit as st mydataset = st.radio( "**Data method**", [":blue[Upload dataset]", ":blue[Get dataset from jira]"], index=None ) def getrecord(): if mydataset == ":blue[Get dataset from jira]": return pd.DataFrame({"Key": [23, 45, 67, 89], "Name": ["AB", "BC", "CD", "EF"]}) elif mydataset == ":blue[Upload dataset]": # 可替换为实际文件上传逻辑 return pd.DataFrame({"Key": [50, 60, 70, 80], "Name": ["AA", "BB", "CC", "DD"]}) else: # 用户未选择时返回None return None # 仅在用户选择数据方式后更新session state if mydataset is not None: df = getrecord() st.session_state["df"] = df st.success("Data loaded successfully!")
DataPlotPage(pages/DataPlotPage.py)
import streamlit as st def dataplot(): # 校验session state中的数据有效性 if "df" not in st.session_state or st.session_state["df"] is None: st.warning("Data is missing, kindly load the data in first page") return df = st.session_state["df"] st.write("Loaded Data:") st.dataframe(df) # 可添加自定义绘图逻辑,例如: # st.bar_chart(df, x="Key", y="Name") dataplot()
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

