『玩转Streamlit』--多页应用

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

Streamlit不仅让创建单页应用变得易如反掌,更通过一系列创新特性,支持构建多页面应用,极大地丰富了用户体验和数据探索的可能性。
随着我们Streamlit App的功能逐渐增多之后,单个页面展示过多信息,使用不便,
通过多页面可以将功能相关的部分构造在一起,形成逻辑清晰的多个页面,使用户能够轻松地与不同的功能模块进行交互。
从代码方面来看,多页面应用将不同的功能模块拆分成独立的页面,每个页面可以有自己的代码逻辑和数据流。
这有助于实现代码的模块化,使代码布局更加清晰、易于管理。
从运行性能上来看,多页面应用可以加快页面的加载速度,因为用户只需加载当前所需页面的内容,而无需加载整个应用的全部内容。
此外,对于复杂的应用来说,多页面应用更容易实现功能的迭代和扩展。
随着应用的发展,可以徐徐添加新的页面和功能模块,而无需对现有页面进行大规模修改。
本篇主要介绍构建一个Streamlit的多页面应用需要把握的根本知识。
1. 多页应用的文件布局

在Streamlit多页面应用中,文件和文件夹的布局对于项目的构造、管理和维护至关重要。
下面是一个推荐的布局方式:
  1. my_app/  
  2. ├── app.py  # 主应用文件,负责启动应用和配置路由
  3. ├── pages/  
  4. │   ├── __init__.py  # 可选,用于将pages文件夹作为Python包处理  
  5. │   ├── page1.py  
  6. │   ├── page2.py  
  7. │   └── ...  # 其他页面文件  
  8. ├── session_state.py  # Session State管理类文件
  9. └── 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为例,创建一个多页面应用。
  1. # app.py
  2. import streamlit as st
  3. page1 = st.Page("pages/page1.py", title="页面1")
  4. page2 = st.Page("pages/page2.py", title="页面2")
  5. pg = st.navigation([page1, page2])
  6. pg.run()
复制代码
  1. # page1.py
  2. import streamlit as st
  3. st.header("这是页面 1")
复制代码
  1. # page2.py
  2. import streamlit as st
  3. st.header("这是页面 2")
复制代码
通过streamlit run app.py 启动之后,一个带有导航的简单多页面应用就完成了。

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

3. 多页之间共享数据

最后,介绍下如安在不同的页面直接共享数据,这样就可以让不同页面的功能联动起来。
Streamlit多页面之间共享数据有几个方案可以实现,
第一个方案是使用全局变量
但是这种方法存在一些问题,好比如并发访问时的数据不同等性和难以调试等。
因此,一样平常不推荐使用全局变量来共享数据。
第二个方案是使用外部存储,好比将共享的数据保存在文件大概数据库中,这种方案适用于需要比力大型的应用,大概需要持久化存储的应用场景。
如果你的应用规模不大,并且不需要持久化存储,那么用这个方案显得有些粗笨。
最后一个方案就是Session State,这是Streamlit提供的一种机制,特殊适合在不同页面之间传递和保存状态数据。
下面构造一个模拟的示例,演示如安在不同的页面间共享数据。
首先在page1.py中,我们可以选择数据集,
然后在page2.py中,会自动根据我们选择的数据集开始分析。
  1. # page1.py
  2. import streamlit as st
  3. 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中。
  1. # page2.py
  2. import streamlit as st
  3. 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中读取数据集的名称。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表