You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:00:35