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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:19:59