Streamlit 多页面应用设计指南:构建模块化数据分析平台

引言

在开发数据分析网页应用时,我们常常面临一个挑战:如何在一个项目中优雅地管理多个子应用,同时保证代码的可读性与维护性。单一的长文件不仅难以管理,而且在IDE中操作时容易出现性能问题。Streamlit,作为一款强大的Web应用框架,提供了灵活的解决方案,使得我们能够构建多页面、模块化的应用,以应对复杂的数据分析需求。

困扰与需求

在制作数据分析网页的过程中,我曾遇到以下困扰:

  • 页面限制与逻辑关联:为了提高用户体验,我们需要将功能相关的部分组织在一起,形成逻辑清晰的多个页面。
  • 代码管理难题:将所有功能塞入一个文件会导致代码冗长,降低开发效率和代码质量。
  • IDE性能问题:大型文件在VSCode等编辑器中加载和代码分析时,可能会遭遇卡顿问题。
    基于以上困扰,我们的目标是:
  1. 实现多应用展示:利用Streamlit构建具有多个界面的网页应用,每个界面专注于不同的数据分析任务。
  2. 子应用独立开发:确保每个子应用的代码逻辑清晰,独立于其他应用,便于开发和后续维护。
  3. 算法与框架分离:将算法实现和框架结构分开存储,以促进代码的复用和扩展性。

设计与实施策略

为了达成上述目标,我们可以采取以下设计策略:

模块化编码

  • 建立子应用模块:为每个子应用创建独立的.py文件,如weather_city.pyweather_country.py,每个文件专注于一个特定的分析任务。
  • 定义app()函数:在每个子应用模块中,定义一个app()函数,该函数封装了整个子应用的逻辑流程和Streamlit界面元素。

构建页面路由

  • 使用字典映射:创建一个字典PAGES,其键是页面名称,值是对应子应用模块的引用。
  • 实现页面选择:在主应用文件中,使用Streamlit的sidebarselectbox组件,让用户选择要查看的页面。

分离算法与框架

  • 算法与业务逻辑分离:将复杂的算法和数据处理逻辑封装在单独的模块或类中,与Streamlit的UI逻辑解耦。
  • 框架结构清晰:保持主应用文件简洁,仅负责页面路由和基本的布局设置,具体功能实现在子应用模块中。

应用框架

image.png
框架包括一个主程序和很多子程序,子程序用__init__.py 作为一个包,让主程序能够很好的调用。

代码示例

mian_weathers

主程序, 这里用的下拉框来选择,也可以用 radio 方法。

import streamlit as st
from pages import weather_city, weather_contry
# 创建一个字典来映射页面标题到页面函数
PAGES = {
    "公共雨量站": weather_city,
    "区内气象站": weather_contry,
}
def main():
    st.sidebar.title('导航') 
    selected_page = st.sidebar.selectbox("选择页面", list(PAGES.keys()))
    # 根据用户选择的页面调用相应的函数
    page = PAGES[selected_page]  
    page.app() 

weather_contry

相当于 page 1,注意子程序所在的 pages 文件夹需要有__init__.py 文件。

# pages/weather_contry.py
import streamlit as st
def app():
    st.title('区内气象站')
    # 页面的具体内容
    st.header('这是页面2的内容')
    st.text('这是页面2的示例文本。')
    st.checkbox('这是一个复选框')
if __name__ == "__main__":
    app()

weather_city

相当于 page 2

# pages/weather_city.py
import streamlit as st
def app():
    st.title('公共雨量站')
    # 页面的具体内容
    st.header('这是页面1的内容')
    st.text('这是一个示例文本,用于演示页面1的功能。')
    st.button('点击我!')     
if __name__ == "__main__":
    app()

注意子程序所在的 pages 文件夹需要有__init__. Py 文件,让所有的子程序被视为一个包,这样主程序才能 import。该文件可以为空,也可以增加一些属性。示例如下。

"""
This is the package documentation string.
It describes what the package does and how to use it.
"""
__author__ = "Your Name"
__version__ = "1.0"

结果预览

运行结果如下。
image.png

结论

通过采用模块化的设计思路,我们可以有效地管理和扩展Streamlit应用,使其既能满足复杂的数据分析需求,又能保持代码的整洁与高效。这种策略不仅提升了开发体验,还为未来的功能迭代奠定了坚实的基础。

BY

纯个人经验,如有帮助,请收藏点赞,如需转载,请注明出处。
微信公众号:环境猫 er
CSDN : 细节处有神明
个人博客:wallflowers (maoyu92.github.io)

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

细节处有神明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值