『玩转Streamlit』--会话状态管理
在Web
应用开发中,会话管理是一个至关重要的概念,它能够帮助开发者追踪用户在应用中的行为和状态,从而为用户提供更加个性化、连贯且高效的交互体验。
Streamlit
作为一个简单而强大的用于快速构建和部署数据科学和机器学习项目,也提供了强大的会话状态管理功能,即st.session_state
。
本文将介绍Streamlit
里的会话状态管理,包括它是什么、有什么用、在哪些情况下能派上用场,还有使用时要注意些什么。
1. 什么是会话管理
会话管理是一种在Web
应用中跟踪用户会话的技术。
当用户与Web
应用进行交互时,会话管理机制会创建一个唯一的会话标识符(session ID),并将其存储在用户的浏览器中(通常以Cookie的形式)。
服务器端会根据这个会话标识符来存储和检索与该用户相关的数据,例如用户输入的信息、应用的状态等。
这样,即使用户在多个页面之间跳转,应用也能够记住用户之前的操作和设置,从而实现跨页面的状态保持。
在传统的Web
开发中,会话管理通常需要借助服务器端的存储机制(如数据库)和复杂的前端与后端交互逻辑来实现。
然而,Streamlit
通过其内置的st.session_state
对象,为开发者提供了一种更加简洁、高效的方式来管理会话状态,无需手动处理底层的会话机制。
2. 会话管理的作用
在Streamlit
应用中,st.session_state
的作用主要体现在以下几个方面:
首先,保持用户输入的状态,当用户在Streamlit
应用中输入数据(如文本框中的文字、下拉菜单的选择等)时,这些输入数据会被存储在st.session_state
中。
即使用户刷新页面或跳转到其他页面,这些输入数据依然可以被保留下来,从而避免了用户重复输入的麻烦。
其次,实现跨页面的状态共享,在复杂的Streamlit
应用中,可能包含多个页面或组件。
通过st.session_state
,开发者可以在不同的页面或组件之间共享状态信息。
例如,用户在页面A中选择了一个特定的参数,这个参数可以通过st.session_state
传递到页面B,从而实现页面之间的数据交互。
最后,动态更新应用界面,根据用户的行为或应用的逻辑,st.session_state
可以动态地更新应用的状态,从而触发界面的重新渲染。
这种动态性使得Streamlit
应用能够更加灵活地响应用户的操作,提供更加流畅的交互体验。
3. 会话管理的示例
为了更好地理解st.session_state
在Streamlit
应用中的实际应用,下面来看看两个具体的示例。
3.1. 用户登录状态管理
假设我们正在开发一个需要用户登录的Streamlit
应用。
我们需要在用户登录后记住他们的登录状态,并在应用的各个页面中根据登录状态显示不同的内容。
import streamlit as st
# 初始化登录状态
if "logged_in" not in st.session_state:
st.session_state.logged_in = False
# 登录页面
def login_page():
st.title("登录页面")
username = st.text_input("用户名")
password = st.text_input("密码", type="password")
if st.button("登录"):
if username == "admin" and password == "password": # 简单的登录验证
st.session_state.logged_in = True
st.success("登录成功!")
else:
st.error("用户名或密码错误!")
# 主页面
def main_page():
st.title("主页面")
if st.session_state.logged_in:
st.write("欢迎,你已经登录!")
if st.button("登出"):
st.session_state.logged_in = False
st.rerun() # 重新运行应用以更新登录状态
else:
st.write("你尚未登录,请先登录。")
login_page()
# 运行主页面
main_page()
运行效果如下:
在这个示例中,我们使用st.session_state.logged_in
来存储用户的登录状态。
当用户在登录页面输入正确的用户名和密码后,st.session_state.logged_in
被设置为True
,表示用户已经登录。
在主页面中,我们根据st.session_state.logged_in
的值来决定显示的内容。
如果用户点击 “登出” 按钮,我们将st.session_state.logged_in
设置为 False
,并重新运行应用以更新登录状态。
3.2. 多页面应用中的数据共享
假设我们正在开发一个包含多个页面的Streamlit
应用,用户在第一个页面中输入了一些数据,我们希望在第二个页面中使用这些数据进行进一步的处理。
import streamlit as st
# 初始化页面索引
if "page_index" not in st.session_state:
st.session_state.page_index = 0
# 页面1:数据输入
def page1():
st.title("页面1:数据输入")
st.session_state.user_input = st.text_input("请输入一些数据")
if st.button("下一步"):
st.session_state.page_index = 1
st.rerun()
# 页面2:数据处理
def page2():
st.title("页面2:数据处理")
st.write("你在页面1输入的数据是:", st.session_state.user_input)
if st.button("返回"):
st.session_state.page_index = 0
st.rerun()
# 根据页面索引显示相应的页面
if st.session_state.page_index == 0:
page1()
else:
page2()
在这个示例中,我们使用st.session_state.page_index
来记录当前显示的页面索引。
在 页面1 中,用户输入的数据被存储在st.session_state.user_input
中。
当用户点击 “下一步” 按钮时,我们将st.session_state.page_index
设置为1
,并重新运行应用以跳转到 页面2。
在页面2中,我们通过st.session_state.user_input
获取用户在页面1中输入的数据,并进行处理。
如果用户点击 “返回” 按钮,我们将st.session_state.page_index
设置为0
,重新运行应用以返回 页面1。
4. 总结
通过以上两个示例,我们可以看到st.session_state
在Streamlit
应用中的强大功能。
它不仅可以保持用户输入的状态,还可以实现跨页面的状态共享和动态更新应用界面。
这些功能使得Streamlit
应用能够更加灵活地响应用户的操作,提供更加丰富的交互体验。
不过,使用时,有些地方还是需要注意:
- 合理使用会话状态:虽然
st.session_state
非常方便,但过度使用可能会导致应用的性能下降。因此,开发者需要合理地规划哪些数据需要存储在会话状态中,哪些数据可以通过其他方式传递。 - 注意数据的安全性:存储在
st.session_state
中的数据可能会被用户通过浏览器的开发者工具访问到。因此,对于敏感数据(如密码等),开发者需要谨慎处理,避免直接存储在会话状态中。 - 避免状态冲突:在多用户同时使用应用的情况下,开发者需要注意避免会话状态之间的冲突。可以通过为每个用户分配唯一的会话标识符来解决这个问题。
- 清理无用状态:当用户完成操作或离开应用时,开发者可以清理
st.session_state
中不再需要的状态信息,以节省资源。
总之,st.session_state
是Streamlit
应用中一个非常有用的工具,它为开发者提供了强大的会话管理功能。
通过合理地使用st.session_state
,开发者可以构建出更加动态、交互式且用户友好的Streamlit
应用。
『玩转Streamlit』--会话状态管理的更多相关文章
- Github 恶搞教程(一起『玩坏』自己的 Github 吧)
最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...
- 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...
- # 2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...
- 『编程题全队』Alpha 阶段冲刺博客Day1
『编程题全队』Alpha 阶段冲刺博客Day1 一.Alpha 阶段全组总任务 二.各个成员在 Alpha 阶段认领的任务 三.明日各个成员的任务安排 孙志威:实现基本的网络连接, 完成燃尽图模块 孙 ...
- 『Python基础-8』列表
『Python基础-8』列表 1. 列表的基本概念 列表让你能够在一个地方存储成组的信息,其中可以只包含几个 元素,也可以包含数百万个元素. 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...
- 『Python基础-5』数字,运算,转换
『Python基础-5』数字,运算,转换 目录 基本的数字类型 二进制,八进制,十六进制 数字类型间的转换 数字运算 1. 数字类型 Python 数字数据类型用于存储数学上的值,比如整数.浮点数.复 ...
- 『Python基础-3』变量、定义变量、变量类型、关键字Python基础-3』变量、定义变量、变量类型、关键字
『Python基础-3』变量.定义变量.变量类型.关键字 目录: 1.Python变量.变量的命名 2.变量的类型(Python数据类型) 3.Python关键字 1. Python 变量.变量的命名 ...
- 『Python基础-1 』 编程语言Python的基础背景知识
#『Python基础-1 』 编程语言Python的基础背景知识 目录: 1.编程语言 1.1 什么是编程语言 1.2 编程语言的种类 1.3 常见的编程语言 1.4 编译型语言和解释型语言的对比 2 ...
随机推荐
- Blazor 组件库 BootstrapBlazor 中Button组件介绍
组件介绍 按钮组件,应该是最基础的组件之一了.感觉没什么可介绍的,但是BootstrapBlazor的按钮,还是有很多不错的特性. 首先是最基础的,boostrap5的按钮样式: 代码如下: < ...
- BeautifulSoup(bs4)细致讲解
BeautifulSoup(bs4) BeautifulSoup是python的一个库,最主要的功能是从网页爬取数据,官方是这样解释的:BeautifulSoup提供一些简单,python式函数来处理 ...
- MySQL底层概述—9.ACID与事务
大纲 1.ACID之原子性 2.ACID之持久性 3.ACID之隔离性 4.ACID之一致性 5.ACID的关系 6.事务控制演进之排队 7.事务控制演进之排它锁 8.事务控制演进之读写锁 9.事务控 ...
- 推进国产化安全应用:德承工控机DV-1100+银河麒麟操作系统Kylin V10 安装教程
银河麒麟操作系统 V10是一款适配国产软硬件平台并深入优化和创新的新一代图形化桌面操作系统,支持国内外多款主流的处理器,飞腾.鲲鹏.海思麒麟.龙芯.申威.海光.兆芯等国产CPU和Intel.AMD等平 ...
- BigDecimal数据处理方法总结
前言 BigDecimal是Java编程语言中位于java.math包中的一个类,主要用于进行高精度的十进制数计算.它提供了对任意精度的十进制数进行精确计算的能力,适用于需要保持精度和执行准确计算 ...
- VTK 视角的旋转、平移、缩放
在CAD/CAM软件中,都需要旋转.平移和缩放视角,来观察操作图形.由于VTK定义的交互的类型不是很适用,所有通过定义一套自己的交互方式. 在下面代码中,鼠标左键平移,滚轮缩放,右键旋转. 先定义一个 ...
- flutter安装过程中 flutter doctor 出现错误 cmdline-tools component is missing
进入Android studio的settings添加tool工具
- Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE)
Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE) Opening the doors and windows 0-click RCE on the Tesla Mod ...
- 【C#】【平时作业】习题-7-继承、抽象与多态
相关概念 什么是继承 继承定义了如何根据现有类创先新类的过程 任何类都可以从另外一个类继承 一个派生出来的子类具有这个类的所有公共属性和方法 类的继承机制 创建新类所根据的基础类称为基类或父类,新建的 ...
- File was changed on disk
刚开始从eclipse转到idea,发现idea从svn同步代码后,点开一个java类报错 说是某个方法不存在,以为是别人代码没有提全,就点到别人代码里面去看,顶行出现"File was c ...