Streamlit报错st.session_state无"new_todo"键的问题求助
Streamlit待办应用报错:st.session_state不存在指定键
问题核心原因
你遇到的报错本质是页面初始化时提前执行了add_todo函数,此时st.session_state里还未创建对应键。问题出在st.text_input的on_change参数:你写的是add_todo()(直接调用函数),而不是add_todo(仅传递函数引用)。这会导致页面加载时立刻执行add_todo,但此时文本输入框还未完成渲染,session_state["todo"](或你之前用的new_todo)还不存在,从而触发报错。
修复步骤
1. 修正on_change参数传递方式
修改web.py中的文本输入框代码,去掉add_todo后的括号:
st.text_input(label="", placeholder="Add New Todo...", on_change=add_todo, key='todo')
2. (可选)增强代码鲁棒性,提前初始化session_state键
在代码开头加入session_state键的初始化逻辑,避免因渲染顺序问题再次报错:
# 放在import语句之后 if "todo" not in st.session_state: st.session_state["todo"] = ""
3. 清理Streamlit缓存(若报错提示的键与当前代码不符)
如果你之前用过new_todo作为键,可能存在缓存残留,运行以下命令清理后重启应用:
streamlit cache clear
完整修正后的web.py代码
import streamlit as st import functions todos = functions.get_todos() # 初始化session_state中的todo键 if "todo" not in st.session_state: st.session_state["todo"] = "" def add_todo(): todo = st.session_state["todo"].strip() if todo: # 避免添加空待办 todos.append(todo + "\n") functions.write_todos(todos) st.session_state["todo"] = "" # 清空输入框 st.title("My Todo App") st.subheader("This is my Todo App") st.write("This app is to increase your productivity.") for todo in todos: st.checkbox(todo) st.text_input(label="", placeholder="Add New Todo...", on_change=add_todo, key='todo')
补充说明
你之前尝试的重启、重命名键、调整函数位置无效,是因为这些操作没有触及核心问题——on_change参数的错误传递方式导致函数提前执行。修正后,add_todo只会在文本输入框内容变化时被调用,此时session_state["todo"]已经存在,就能正常获取输入内容。
内容的提问来源于stack exchange,提问作者Aditya Singh
相关产品推荐
相关产品推荐

