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. 最佳实践
- 保持页面独立: 每个页面应尽可能独立,减少依赖
- 合理组织项目结构: 按功能或模块划分页面
- 使用共享状态: 用
st.session_state
在页面间共享数据 - 统一风格: 在
main.py
中设置全局样式和配置 - 考虑性能: 大数据处理放在单独页面,避免影响导航速度
- 错误处理: 每个页面应有基本的错误处理机制
7. 限制与注意事项
- 所有页面共享同一个Python进程
- 页面切换不会重置状态(除非手动清除)
- 页面加载顺序不可完全控制
- 复杂的页面间通信可能需要额外设计
通过合理使用Streamlit的多页面功能,你可以构建出结构清晰、功能丰富的数据应用程序,同时保持代码的良好组织性。