[具身智能-507]:streamlit工作原理、架构和应用代码示例
Streamlit 之所以能实现“纯 Python 写网页”背后其实是一套非常巧妙的架构设计。它采用经典的客户端-服务器架构Python后端负责执行你的脚本而基于 TypeScript/React 的前端负责在浏览器中渲染出漂亮的用户界面。⚙️ Streamlit 的核心工作原理Streamlit 的工作流可以概括为以下几个关键步骤脚本执行与服务器启动当你运行streamlit run app.py时Streamlit 会在本地启动一个基于Tornado 框架的 Web 服务器。双向通信服务器与浏览器之间通过WebSocket建立实时双向连接。后端通过 Protocol Buffers一种高效的数据序列化协议向前端发送指令前端也会将用户的交互操作如点击按钮、拖动滑块实时传回后端。Rerun重运行机制这是 Streamlit 最核心的特性。每当用户与界面发生交互或者你修改并保存了代码整个 Python 脚本都会从上到下重新执行一遍。增量渲染脚本重新执行后Streamlit 会对比前后的状态将最新的 UI 元素Delta通过WebSocket 推送到前端浏览器随之自动刷新局部内容让你感觉界面是实时响应的。️ Streamlit 的核心架构Streamlit 的架构主要围绕以下几个核心概念构建运行时Runtime整个应用的生命周期管理者负责协调所有的用户会话。应用会话AppSession每个打开应用的浏览器标签页都是一个独立的会话。因为“Rerun 机制”会重置普通变量Streamlit 提供了Session State会话状态来在多次重运行之间持久化保存用户的数据和状态。脚本运行器Script Runner专门负责在服务器上执行你的 Python 脚本并将生成的 UI 指令打包成消息队列。前端渲染器基于 React 构建负责接收后端的消息并将其转化为网页上的按钮、图表和文字。 应用代码示例下面是一个综合了数据展示、交互控件、会话状态管理以及性能优化的完整代码示例。你可以直接将其保存为app.py并在本地运行。pythonimport streamlit as st import pandas as pd import numpy as np import time # 1. 性能优化使用缓存装饰器避免重复加载数据 # 只有当文件路径变化时才会重新执行极大提升 rerun 时的速度 st.cache_data def load_data(): # 模拟加载一份销售数据 dates pd.date_range(start2026-01-01, periods100) data pd.DataFrame({ 日期: dates, 销售额: np.random.randint(1000, 5000, size100), 订单量: np.random.randint(10, 100, size100) }) return data # 页面标题 st.title( 企业销售数据仪表盘) # 2. 交互控件侧边栏筛选 st.sidebar.header(筛选条件) min_sales st.sidebar.slider(最低销售额, 0, 5000, 1000) show_chart st.sidebar.checkbox(显示趋势图表, valueTrue) # 加载数据 df load_data() # 根据筛选条件过滤数据 filtered_df df[df[销售额] min_sales] # 3. 数据展示 st.metric(label当前筛选下的总订单量, valuefiltered_df[订单量].sum()) st.dataframe(filtered_df) # 4. 会话状态 (Session State) 管理 # 解决 rerun 机制导致的变量重置问题 if click_count not in st.session_state: st.session_state.click_count 0 if st.button( 点赞这篇博客): st.session_state.click_count 1 st.write(f当前点赞数{st.session_state.click_count}) # 5. 动态图表展示 if show_chart: st.subheader(销售额趋势图) st.line_chart(filtered_df.set_index(日期)[销售额]) 代码解析st.cache_data在每次交互触发脚本重运行时被装饰的函数不会重复执行直接从缓存中读取结果这对于处理大规模数据或调用 AI 接口非常关键。st.session_state就像给应用装了一个“记事本”即使用户点了按钮触发了全量重运行点赞数也不会清零。声明式语法你不需要写if button_clicked: update_ui()这样的逻辑只需要按顺序写出“你想要界面上出现什么”Streamlit 会自动帮你处理事件监听和界面更新。