Streamlit缓存异常:含st.text_input的函数刷新后缓存失效?
Streamlit缓存st.text_input输入内容刷新后丢失的原因分析
问题描述
我在使用st.text_input结合st.cache_data时遇到异常,怀疑是用法有误。示例中,printer函数返回硬编码字符串"Message",缓存正常,刷新后内容仍能显示;但printer2函数获取用户输入的st.text_input值,虽能临时缓存,浏览器刷新后st.write无法显示该输入内容。需求是让用户输入内容被缓存并在刷新后显示,变量p为字符串类型,请问问题原因是什么?
代码示例
import streamlit as st import time @st.cache_data(experimental_allow_widgets=True) def printer(): st.write("Running") time.sleep(3) return 'Message' st.write(printer()) #刷新后“Message”成功显示且已缓存 @st.cache_data(experimental_allow_widgets=True) def printer2(): p = st.text_input(label='com') time.sleep(3) return p st.write(printer2()) #刷新后用户输入的文本不显示
原因分析
核心问题出在Streamlit缓存机制与小部件状态的独立管理逻辑:
printer函数的返回值是固定硬编码字符串,缓存键仅由函数参数(无参数)决定,缓存命中后直接返回固定值,刷新后自然能正常显示。printer2函数内部调用st.text_input,但st.text_input的输入状态由Streamlit的**会话状态(session state)**单独管理,并不属于缓存函数的缓存键组成部分:- 页面刷新时,首先触发缓存检查,
printer2无参数,缓存键不变,会直接返回缓存的旧输入值。 - 但Streamlit会重新渲染页面上的所有小部件,
st.text_input默认会重置为空值(因为会话状态在刷新时未被显式保存),此时小部件的空值会覆盖缓存返回值的显示。 experimental_allow_widgets=True仅允许在缓存函数内使用小部件,不会将小部件的输入值纳入缓存键,也无法持久化小部件的会话状态。
- 页面刷新时,首先触发缓存检查,
修正方案
要实现用户输入内容刷新后仍能显示,需结合st.session_state持久化输入状态,再配合缓存使用:
import streamlit as st import time @st.cache_data(experimental_allow_widgets=True) def printer(): st.write("Running") time.sleep(3) return 'Message' st.write(printer()) # 初始化会话状态保存输入值 if 'user_input' not in st.session_state: st.session_state.user_input = "" # 绑定小部件到会话状态 p = st.text_input(label='com', value=st.session_state.user_input) st.session_state.user_input = p # 以输入值作为缓存参数,确保缓存键随输入变化 @st.cache_data def printer2(input_val): time.sleep(3) return input_val st.write(printer2(p))
内容的提问来源于stack exchange,提问作者Kapzillion
相关产品推荐
相关产品推荐

