我注意到用于缓存的 st.text_input 要么无法正常工作,要么我做错了什么。下面我有一个函数(打印机)返回硬编码字符串“Message”的示例,该字符串已成功缓存并在刷新后重新出现。虽然第二个函数(printer2)将用户输入临时保存在缓存中,但它不会像第一个函数(printer)一样在浏览器刷新后显示 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()) #after a refresh "Message" shows up successfully and cached
@st.cache_data(experimental_allow_widgets=True)
def printer2():
p = st.text_input(label='com')
time.sleep(3)
return p
st.write(printer2()) #after a refresh, user text does not show up`
预期行为:
这两个函数都应该缓存字符串并在浏览器刷新后显示
实际行为:
只有第一个函数(printer)在刷新后显示字符串,而第二个函数(printer2)则不显示。 Printer2 似乎最初缓存了该字符串,但刷新后它就消失了。
如果您只是想在应用程序刷新期间保留用户输入,我绝对建议使用会话状态。
有关会话状态的一些有用信息:
会话状态提供了跨会话存储变量的功能 重播。小部件状态(即小部件的值)也存储在 会议。
为了简单起见,我们已将这些信息统一到一处。 IE。 会话状态。这个便利的功能使得它非常容易 在应用程序代码中的任何位置读取或写入小部件的状态。 会话状态变量使用键镜像小部件值 争论。
换句话说,如果您使用键声明
st.text_input
小部件,则可以通过该键从会话状态检索小部件的值。
p = st.text_input(label="com", key="p_text_input")
# Write the value of the text input widget
st.write(st.session_state.p_text_input)