Streamlit 多页面应用详解

Streamlit 从 1.10.0 版本开始正式支持多页面应用功能,使得构建复杂的应用程序变得更加简单和结构化。以下是关于 Streamlit 多页面应用的全面讲解:

1. 多页面应用基础

项目结构

多页面应用需要特定的文件结构:

your_app/
├── main.py        # 主页面(入口文件)
└── pages/
    ├── page1.py   # 页面1
    ├── page2.py   # 页面2
    └── ...        # 其他页面

工作原理

  • main.py 是应用的入口点
  • pages/ 目录下的每个 .py 文件都会自动成为应用的子页面
  • Streamlit 会自动在侧边栏生成导航菜单

2. 页面配置

文件名约定

文件名决定了页面在导航中的显示顺序和标题:

格式: [排序数字]_[表情图标]_[页面名称].py
示例: 1_📊_仪表板.py
  • 排序数字: 控制页面在导航中的顺序 (1, 2, 3…)
  • 表情图标: 可选的emoji图标 (如📊、🔍、⚙️)
  • 页面名称: 导航中显示的标题 (下划线会被转换为空格)

示例结构

my_app/
├── main.py
└── pages/
    ├── 1_🏠_首页.py
    ├── 2_📈_数据分析.py
    ├── 3_🔍_探索.py
    └── 4_⚙️_设置.py

3. 页面间共享数据

使用Session State

# 在任何页面中设置共享数据
st.session_state.shared_data = "这是共享的数据"

# 在其他页面中访问
if 'shared_data' in st.session_state:
    st.write(st.session_state.shared_data)

使用查询参数

# 设置查询参数
st.experimental_set_query_params(page="analytics")

# 获取查询参数
query_params = st.experimental_get_query_params()
if "page" in query_params:
    st.write(f"当前页面参数: {query_params['page'][0]}")

4. 高级多页面模式

动态页面加载

# 在main.py中根据条件加载不同内容
page = st.sidebar.selectbox("选择页面", ["主页", "分析", "设置"])

if page == "主页":
    st.title("主页内容")
elif page == "分析":
    st.title("分析页面")

自定义导航

# 隐藏默认导航并创建自定义导航
st.markdown("""
<style>
    [data-testid="stSidebarNav"] {
        display: none;
    }
</style>
""", unsafe_allow_html=True)

# 自定义导航链接
st.sidebar.page_link("main.py", label="主页")
st.sidebar.page_link("pages/1_分析.py", label="数据分析")

5. 实际应用示例

示例1: 数据分析应用

data_app/
├── main.py
└── pages/
    ├── 1_📊_总览.py
    ├── 2_📈_趋势分析.py
    ├── 3_🔍_详细数据.py
    └── 4_⚙️_设置.py

main.py:

import streamlit as st

st.set_page_config(layout="wide")
st.title("数据分析平台")
st.write("欢迎使用数据分析平台,请从侧边栏选择页面")

pages/1_📊_总览.py:

import streamlit as st

st.title("数据总览")
st.write("这里是数据的整体概览")

# 共享数据示例
if 'dataset' not in st.session_state:
    st.session_state.dataset = "sales_data.csv"
    
st.write(f"当前数据集: {st.session_state.dataset}")

示例2: 带认证的多页面应用

auth_app/
├── main.py
└── pages/
    ├── 1_🔑_登录.py
    ├── 2_🏠_主页.py
    ├── 3_📄_文档.py
    └── 4_👤_个人资料.py

main.py:

import streamlit as st

# 初始化认证状态
if 'authenticated' not in st.session_state:
    st.session_state.authenticated = False

# 根据认证状态重定向
if not st.session_state.authenticated:
    st.switch_page("pages/1_🔑_登录.py")
else:
    st.switch_page("pages/2_🏠_主页.py")

pages/1_🔑_登录.py:

import streamlit as st

st.title("登录")

username = st.text_input("用户名")
password = st.text_input("密码", type="password")

if st.button("登录"):
    if username == "admin" and password == "1234":
        st.session_state.authenticated = True
        st.session_state.username = username
        st.switch_page("pages/2_🏠_主页.py")
    else:
        st.error("用户名或密码错误")

6. 最佳实践

  1. 保持页面独立: 每个页面应尽可能独立,减少依赖
  2. 合理组织项目结构: 按功能或模块划分页面
  3. 使用共享状态: 用 st.session_state 在页面间共享数据
  4. 统一风格: 在 main.py 中设置全局样式和配置
  5. 考虑性能: 大数据处理放在单独页面,避免影响导航速度
  6. 错误处理: 每个页面应有基本的错误处理机制

7. 限制与注意事项

  1. 所有页面共享同一个Python进程
  2. 页面切换不会重置状态(除非手动清除)
  3. 页面加载顺序不可完全控制
  4. 复杂的页面间通信可能需要额外设计

通过合理使用Streamlit的多页面功能,你可以构建出结构清晰、功能丰富的数据应用程序,同时保持代码的良好组织性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭梨山大哎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值