Streamlit(二十)- API 参考文档(十三)- 缓存与状态管理组件

文章目录


一、服务端(SERVER)分组

1. st.cache_data:函数数据缓存装饰器

功能说明

用于缓存计算结果数据 (DataFrame、接口返回数据、统计结果、模型推理输出等)的装饰器。

缓存数据会做拷贝隔离,每个会话读取独立副本;适合频繁查询、重复计算、不占用全局连接的数据。

核心参数

参数 说明
ttl 缓存过期时长,单位秒/时间字符串,None永久有效
max_entries 缓存最大存储条目数,超限自动淘汰最旧缓存
show_spinner 缓存未命中时展示加载动画,可自定义提示文字
persist 设置为disk可将缓存持久化到本地磁盘,重启应用不丢失
hash_funcs 自定义类型哈希函数,用于无法自动哈希的自定义对象

常用内置方法

  • func.clear():清空该函数指定参数的缓存 / 全部缓存
  • st.cache_data.clear():全局清空所有cache_data缓存

代码示例

python 复制代码
import streamlit as st

# 缓存接口查询数据,持久化到磁盘,有效期1天
@st.cache_data(ttl="1d", persist="disk")
def load_online_data(url):
    # 模拟接口请求
    import pandas as pd
    return pd.DataFrame({"value": [1,2,3]})

df = load_online_data("https://demo.api.com/data")

2. st.cache_resource:全局资源缓存装饰器

功能说明

用于缓存全局共享资源(数据库连接、AI大模型、GPU推理实例、文件句柄等),资源对象全应用、多会话共享,不会生成数据拷贝,节省内存。

注意:缓存资源需要线程安全,多用户并发访问不会冲突。

核心参数

大部分参数与st.cache_data通用,独有:

  • validate:资源校验函数,每次读取缓存时执行,返回False则自动重新创建资源

常用内置方法

  • func.clear():清空当前函数缓存
  • st.cache_resource.clear():全局清空所有资源缓存

代码示例

python 复制代码
import streamlit as st
from transformers import pipeline

# 全局缓存NLP大模型,所有用户共用一个模型实例
@st.cache_resource
def load_sentiment_model():
    model = pipeline("sentiment-analysis")
    return model

model = load_sentiment_model()
result = model("我爱Streamlit")
st.write(result)

cache_datacache_resource 核心区别

特性 st.cache_data st.cache_resource
缓存内容 计算数据、表格、文本结果 模型、数据库连接、硬件资源
内存隔离 每个会话生成独立数据拷贝 全应用单例共享,无拷贝
使用场景 接口查询、数据清洗、统计计算 加载大模型、创建数据库连接

3. st.session_state:会话状态存储对象

功能说明

字典式会话存储,单独隔离每个浏览器标签页/用户会话,页面重运行、多页面跳转时数据不会丢失;用来存储控件值、临时变量、登录信息、计算中间结果。

基础操作语法

  1. 初始化(防止重复创建)
python 复制代码
if "username" not in st.session_state:
    st.session_state.username = ""
  1. 读写取值(两种写法等效)
python 复制代码
# 点语法
st.session_state.username = "小明"
# 字典下标语法
st.session_state["username"] = "小明"
# 读取
st.write(st.session_state.username)
  1. 删除键值
python 复制代码
# 删除单个key
del st.session_state.username
# 清空全部会话数据
for key in st.session_state.keys():
    del st.session_state[key]

关键特性

  1. 控件自动绑定 :设置了key参数的组件,值会自动同步到session_state
python 复制代码
st.text_input("输入姓名", key="name")
st.write(st.session_state.name) # 自动读取输入框内容
  1. 配合回调函数 :按钮、输入框的on_click/on_change回调可以修改会话状态
  2. 多页面互通 :同一个会话下所有页面共享session_state数据

限制

  • 不建议直接修改已渲染控件对应的key值,会抛出异常;初始化需在控件渲染前完成
  • 部分特殊对象(未序列化的lambda、数据库游标)默认无法存储,可开启强制序列化配置

二、浏览器端(BROWSER)分组

1. st.context:浏览器上下文信息对象

功能说明

只读对象,用于读取当前用户浏览器请求的上下文信息,仅可读取、无法修改,适合鉴权、环境识别场景。

核心属性

  1. st.context.cookies
    • 只读字典,获取浏览器发送的全部Cookie;
    • 取值示例:st.context.cookies["_ga"]
  2. st.context.headers
    • 只读请求头字典,键名大小写不敏感;
    • 普通取值仅获取重复Header的最后一个值;
    • headers.get_all("key"):获取同一个键的全部Header值列表。

代码示例

python 复制代码
import streamlit as st

# 读取全部Cookie
st.write("当前Cookie:", st.context.cookies)
# 读取指定Cookie
ga_cookie = st.context.cookies.get("_ga", "无")
st.write("GA Cookie值:", ga_cookie)

# 读取Host请求头
host = st.context.headers["host"]
st.write("访问域名:", host)
# 获取全部Accept编码头
all_accept = st.context.headers.get_all("accept-encoding")
st.write("全部编码头:", all_accept)

2. st.query_params:URL查询参数管理对象

功能说明

字典式读写对象,用于读取、修改浏览器地址栏URL上的?key=value查询参数;修改后浏览器地址会自动同步更新,支持多页面传参、页面分享链接。

基础读写语法

python 复制代码
import streamlit as st

# 读取参数(下标/属性两种写法)
id_val = st.query_params["id"]
name_val = st.query_params.name

# 修改参数,URL自动刷新
st.query_params.id = "1001"
st.query_params.name = "测试用户"

处理重复Key(同一个参数出现多次 ?a=1&a=2

  • 直接取值只会拿到最后一个值;
  • .get_all(key) 获取该键所有值组成列表;
  • 赋值列表可生成重复参数:st.query_params.a = ["1", "2", "3"]
python 复制代码
# 获取全部同名参数
all_a = st.query_params.get_all("a")
st.write(all_a)

内置常用方法

  1. .clear():清空URL全部查询参数

    python 复制代码
    st.query_params.clear()
  2. .from_dict(dict):批量覆盖所有查询参数

    python 复制代码
    st.query_params.from_dict({"page": "dashboard", "type": "data"})
  3. .to_dict():将当前参数转为标准字典返回

典型使用场景

  1. 页面间跳转传递ID、筛选条件;
  2. 生成带参数分享链接,打开页面自动读取参数加载对应数据;
  3. 保存筛选器状态到URL,刷新页面不会丢失筛选条件。
相关推荐
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第一章 Item 7 - 9)
开发语言·数据库·python
weixin_BYSJ19871 小时前
基于Django的非物质文化遗产管理系统设计与实现(源码 + 文档)98950
java·javascript·spring boot·python·django·flask·php
Wonderful U1 小时前
基于Python+Django+psutil的轻量化服务器自动化监控平台实战
服务器·python·django
烤代码的吐司君1 小时前
Redis 简介和安装
python
毕设做完了吗?2 小时前
YOLO+paddlecor的智能车牌识别系统
人工智能·python·yolo·目标检测·计算机视觉
li星野2 小时前
RAG优化系列:自适应检索(Adaptive Retrieval)——让系统智能选择是否检索
人工智能·python·学习
weixin_BYSJ19872 小时前
springboot鹿邑县旅游网站99312(源码+文档)
java·javascript·spring boot·python·django·flask·php
H Journey2 小时前
python包和项目管理工具uv、conda介绍
python·conda·uv
星空椰10 小时前
Python 面向对象高级:继承与类定义详解
开发语言·python