首页 > 其他分享 >『玩转Streamlit』--多页应用

『玩转Streamlit』--多页应用

时间:2024-10-25 12:11:22浏览次数:1  
标签:-- py st 应用 多页 Streamlit page1 page2 页面

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.pycommon.py不是必需的,当应用的session管理变得复杂,或者共通函数比较多时才需要单独用文件管理。

对于简单的多页面应用,一般只需要上面的app.pypage1.pypage2.py就够了。

2. 多页应用的导航

Streamlit中,使用st.navigation,可以帮助我们轻松地创建动态导航菜单。

比如,以app.pypage1.pypage2.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.pypage2.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中读取数据集的名称。

标签:--,py,st,应用,多页,Streamlit,page1,page2,页面
From: https://www.cnblogs.com/wang_yb/p/18502232

相关文章

  • 基于DPAPI+RDP技术实现本地打开远程程序,并映射到本地机器桌面上
    本教程使用工具所使用的环境说明:启动器开发工具:VS2022启动器所用客户端技术:.NET8+WPF启动器其他技术:DPAPI启动器发布的可执行程序,系统要求:Windows7以及以上,X64如果需要本程序,可以在网盘获取。网盘地址:通过网盘分享的文件:RemoteShadowApp.7z链接:https://pan.baidu.com......
  • 触觉智能赴南方科技大学进行Purple Pi OH开源鸿蒙开发板培训圆满完成!
    10月19日,深圳触觉智能科技有限公司来到了深圳南方科技大学电子信息实验教学示范中心(以下简称触觉智能和南科大),为同学们培训鸿蒙开发板。该开发板型号PurplePiOH,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。据实验教学示范中心吴老师介绍,自......
  • 什么是敏捷组织
    敏捷组织是一种在不断变化的商业环境中应对挑战的组织形态。它的核心思想在于适应快速变化的市场需求和技术进步,通过灵活、高效的管理方式实现持续创新和优化。敏捷组织注重员工的自主决策和跨职能合作,以迅速响应客户需求、提高工作效率和质量为目标。一、敏捷组织的特征敏捷......
  • Swift 中如何利用闭包实现异步回调?
    在Swift中,闭包是自包含的函数代码块,可以在代码中被传递和使用。它们非常适合用于实现异步回调,主要因为闭包能够捕获和存储其所在上下文中的任何常量和变量的引用。异步回调的实现步骤如下:1、 定义一个接受闭包作为参数的函数。这个闭包的类型取决于你期望的回调数据类型和逻辑。......
  • kd-tree和ball-tree在算法实现原理上有什么区别
    kd-tree和ball-tree在算法实现原理上的区别主要体现在:1.结构不同;2.划分方式不同;3.查询效率不同;4.应用场景不同;5.空间利用效率不同。总的来说,kd-tree在处理低维数据时效率较高,而ball-tree更适合处理高维数据。kd-tree是一种二叉树结构,而ball-tree则是一种层次化的数据结构。1.......
  • JavaScript模块化开发
    什么是模块化?◼到底什么是模块化、模块化开发呢?事实上模块化开发最终的目的是将程序划分成一个个小的结构;这个结构中编写属于自己的逻辑代码,有自己的作用域,定义变量名词时不会影响到其他的结构;这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用;也可......
  • blender4.2 插件安装 auto-rig 报错'bpy.app' object has no attribute 'version_char
     找到安装的插件位置的version.py文件我的在  "C:\Users\zyz\AppData\Roaming\BlenderFoundation\Blender\4.2\scripts\addons\auto_rig_pro-master\src\lib\version.py"可以参考一下 修改代码第8行的代码,#_char=bpy.app.version_char_char=getattr(bpy.app,'ver......
  • 《代码大全2》读书笔记2
    第五章软件构建的设计中,作者首先阐释了“软件设计”是指构思、发明或设计将计算机软件规范变成可工作的软件的一种方案。设计是一个棘手的问题,人总是在试卷答完之后认为自己的成绩很好,实际上90%的情况是错一部分,不管这个错是大是小,总归是有错的。塔科马海峡桥是一个经典例子,在修建......
  • AM05 AUT24 Outfit Of The Day Recommendation
    AM05AUT24FinalProjectAssignment:OutfitOfTheDayRecommendationSystem1AM05AUT24FinalProjectAssignment:OutfitOfTheDayRecommendationSystemIntroductionWelcometoyourfinalprojectfortheDataManagementcourse.Thisprojectisdesigned......
  • 两台服务器(宝塔)配置Nginx负载搭建
    什么是负载均衡负载均衡就是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。一、准备两天服务器搭建好Nginx1、A服务192.168.0.1 B服务192.168.0.2注意了:宝塔Nginx负载必须有一个子......