使用文本输入与写入进行 Streamlit 刷新缓存(experimental_allow_widget bug?)

问题描述 投票:0回答:1

我注意到用于缓存的 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`

Pre and Post Refresh

预期行为:

这两个函数都应该缓存字符串并在浏览器刷新后显示

实际行为:

只有第一个函数(printer)在刷新后显示字符串,而第二个函数(printer2)则不显示。 Printer2 似乎最初缓存了该字符串,但刷新后它就消失了。

caching refresh streamlit
1个回答
0
投票

如果您只是想在应用程序刷新期间保留用户输入,我绝对建议使用会话状态

有关会话状态的一些有用信息:

会话状态提供了跨会话存储变量的功能 重播。小部件状态(即小部件的值)也存储在 会议。

为了简单起见,我们已将这些信息统一到一处。 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)
© www.soinside.com 2019 - 2024. All rights reserved.