『玩转Streamlit』--多页应用
Streamlit不仅让创建单页应用变得易如反掌,更通过一系列创新特性,支持构建多页面应用,极大地丰富了用户体验和数据探索的可能性。
随着我们Streamlit App的功能逐渐增多之后,单个页面展示过多信息,使用不便,
通过多页面可以将功能相关的部分组织在一起,形成逻辑清晰的多个页面,使用户能够轻松地与不同的功能模块进行交互。
从代码方面来看,多页面应用将不同的功能模块拆分成独立的页面,每个页面可以有自己的代码逻辑和数据流。
这有助于实现代码的模块化,使代码结构更加清晰、易于管理。
从运行性能上来看,多页面应用可以加快页面的加载速度,因为用户只需加载当前所需页面的内容,而无需加载整个应用的全部内容。
此外,对于复杂的应用来说,多页面应用更容易实现功能的迭代和扩展。
随着应用的发展,可以逐步添加新的页面和功能模块,而无需对现有页面进行大规模修改。
本篇主要介绍构建一个Streamlit的多页面应用需要掌握的基本知识。
1. 多页应用的文件结构
在Streamlit多页面应用中,文件和文件夹的布局对于项目的组织、管理和维护至关重要。
下面是一个推荐的布局方式:
my_app/
├── app.py # 主应用文件,负责启动应用和配置路由
├── pages/
│ ├── __init__.py # 可选,用于将pages文件夹作为Python包处理
│ ├── page1.py
│ ├── page2.py
│ └── ... # 其他页面文件
├── session_state.py # Session State管理类文件
└── common.py # 共通函数
扩展功能时,在pages文件夹下添加新的py文件即可。
其中session_state.py和common.py不是必需的,当应用的session管理变得复杂,或者共通函数比较多时才需要单独用文件管理。
对于简单的多页面应用,一般只需要上面的app.py,page1.py和page2.py就够了。
2. 多页应用的导航
在Streamlit中,使用st.navigation,可以帮助我们轻松地创建动态导航菜单。
比如,以app.py,page1.py和page2.py为例,创建一个多页面应用。
# app.py
import streamlit as st
page1 = st.Page("pages/page1.py", title="页面1")
page2 = st.Page("pages/page2.py", title="页面2")
pg = st.navigation([page1, page2])
pg.run()
# page1.py
import streamlit as st
st.header("这是页面 1")
# page2.py
import streamlit as st
st.header("这是页面 2")
通过streamlit run app.py 启动之后,一个带有导航的简单多页面应用就完成了。

通过侧边栏中的菜单,可以自由切换页面。
除了通过app.py生成的菜单来切换页面,Streamlit中还提供了st.switch_page方法,
可以在一个页面中导航到其他页面。
比如,可以在page1.py和page2.py中添加一个互相导航的按钮。
# page1.py
import streamlit as st
st.header("这是页面 1")
if st.button("GoTo Page 2"):
st.switch_page("pages/page2.py")
# page2.py
import streamlit as st
st.header("这是页面 2")
if st.button("GoTo Page 1"):
st.switch_page("pages/page1.py")

3. 多页之间共享数据
最后,介绍下如何在不同的页面直接共享数据,这样就可以让不同页面的功能联动起来。
Streamlit多页面之间共享数据有几个方案可以实现,
第一个方案是使用全局变量,
但是这种方法存在一些问题,比如如并发访问时的数据不一致性和难以调试等。
因此,一般不推荐使用全局变量来共享数据。
第二个方案是使用外部存储,比如将共享的数据保存在文件或者数据库中,这种方案适用于需要比较大型的应用,或者需要持久化存储的应用场景。
如果你的应用规模不大,并且不需要持久化存储,那么用这个方案显得有些笨重。
最后一个方案就是Session State,这是Streamlit提供的一种机制,特别适合在不同页面之间传递和保存状态数据。
下面构造一个模拟的示例,演示如何在不同的页面间共享数据。
首先在page1.py中,我们可以选择数据集,
然后在page2.py中,会自动根据我们选择的数据集开始分析。
# page1.py
import streamlit as st
st.header("这是页面 1")
if st.button("GoTo Page 2"):
st.switch_page("pages/page2.py")
datalist = ("", "人口数据", "环境数据", "交易数据")
if "dataset" not in st.session_state:
option = st.selectbox(
"请选择数据集",
datalist,
)
else:
option = st.session_state.dataset
option = st.selectbox(
"请选择数据集",
datalist,
index=datalist.index(option),
)
if option == "":
st.write("当前尚未选择数据集")
else:
st.write("你当前选择的是: 【", option, "】")
st.session_state.dataset = option
page1.py中将选择数据集名称保存到Session State中。
# page2.py
import streamlit as st
st.header("这是页面 2")
if st.button("GoTo Page 1"):
st.switch_page("pages/page1.py")
if "dataset" not in st.session_state or st.session_state.dataset == "":
st.write("当前尚未选择数据集")
else:
st.write("开始分析数据集: 【", st.session_state.dataset, "】")
page2.py直接从Session State中读取数据集的名称。

『玩转Streamlit』--多页应用的更多相关文章
- Github 恶搞教程(一起『玩坏』自己的 Github 吧)
最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Exp9:Web安全基础
2017-2018-2 『网络对抗技术』Exp9:Web安全基础 --------CONTENTS-------- 一.基础问题回答 1.SQL注入攻击原理,如何防御? 2.XSS攻击的原理,如何防御 ...
- 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图
之前写过三篇文章,收获了极其不错的阅读量与转发量: 你真的会用 VS Code 的 Ctrl.Shift和Alt吗?高效易用的快捷键:多光标.跳转引用等轻松搞定 VS Code 中的 Vim 操作 | ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析
2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌图片:自己的图片控件
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件
代码: using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DemoWebControl ...
- 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...
随机推荐
- 树莓派命令行配置wifi密码时如何实现密码加密(密文,非明文)
首先需要知道,树莓派系统(原生系统)的wifi配置文件为: /etc/wpa_supplicant/wpa_supplicant.conf 配置该文件时,psk属性为密码,往往我们都是使用明文来进行配 ...
- 大模型时代的程序员:不会用AIGC编程,未来5年将被淘汰?
作者 | 郭炜 策划 | 凌敏 前言 下面是一段利用 Co-Pilot 辅助开发的小视频,这是 Apache SeaTunnel 开发者日常开发流程中的一小部分.如果你还没有用过 Co-Pilot.C ...
- SMU Autumn 2023 Round 1(Div.1)
SMU Autumn 2023 Round 1(Div.1) A. Set or Decrease(枚举) 题意就是你可以进行两种操作,将\(a_i-1\)或者令\(a_i\)等于\(a_j\),然后 ...
- bazel简介(二)——从makefile向bazel转变(使用genrule)
0x01 背景 上篇中已经介绍了bazel的基本工作原理和相关的概念.这篇将继续介绍下,现有的makefile构建工程如何切换到bazel构建系统. bazel提供了丰富的扩展方式,当然也支持从目前的 ...
- B2B进销存ERP后台管理系统的逻辑架构与设计,AxureRP原型产品经理实战案例
模块分析: 进销存系统是一种用于企业管理库存.销售和采购活动的信息系统.它的主要作用包括但不限于以下几个方面: 1.库存管理 实时库存跟踪:准确记录每种商品的库存数量,确保数据的实时性和准确性. 库存 ...
- SQL中解决i+1 & values中插入变量
基于JDBC环境下使用mysql插入数据的一些小问题 下方代码用于实现 批量向数据库中插入数据 一般为"垃圾"数据 代码例子实现i+1的效果 i=1 i+1=2 for (int ...
- 使用 nuxi info 查看 Nuxt 项目详细信息
title: 使用 nuxi info 查看 Nuxt 项目详细信息 date: 2024/9/5 updated: 2024/9/5 author: cmdragon excerpt: 摘要:文章介 ...
- 千万级别mysql 分库分表后表分页查询优化方案初探
随着使用的用户群体越来越多,表数据也会随着时间的推移,单表的数据量会越来越大. 以订单表为例,假如每天的订单量在 4 万左右,那么一个月的订单量就是 120 多万,一年就是 1400 多万,随着年数的 ...
- sharepoint 打开rdl报表,报表服务器数据库内出错。此错误可能是因连接失败、超时或数据库中磁盘空间不足而导致的
最近在做reporting services报表的时候,部署到sharepoint后,打开rdl报表,经常遇到一个问题: 报表服务器数据库内出错.此错误可能是因连接失败.超时或数据库中磁盘空间不足而导 ...
- 知识点考古:php5的面向对象学习笔记
闲来无事翻看以前收藏的资料,考古到保存的这篇文章对php的OOP的整理还很系统.原链接已经打不开(http://www.cublog.cn/u/17686/showart.php?id=146562) ...