Streamlit评论模块提交触发KeyError问题求助
Streamlit电影评论应用提交时触发KeyError:st.session_state无对应键
开发基于Streamlit的电影评论应用,尝试将用户提交的评论存入数据库,但点击提交按钮时触发KeyError,提示st.session_state has no key "yy",尝试多种在线方案未解决,相关代码及报错信息如下:
导入模块代码
import streamlit as st from streamlit_option_menu import option_menu import json from streamlit_lottie import st_lottie import pickle import requests from db1 import insert_review, fetch_all_reviews, get_movie_review movies = pickle.load(open('movie_list.pkl', 'rb')) similarity = pickle.load(open('similarity.pkl', 'rb'))
Review页面核心代码
if selected == "Review": st.title("Reviews") with st.form("my_form"): st.write("Type your Review") user_name_rev = st.text_input("User Name") movie_list = movies['title'].values selected_movie = st.selectbox( "Type or select a movie from the dropdown", movie_list ) slider_val = st.slider("Rating", 1, 10) movie_rev = st.text_area("Write your review") submitted = st.form_submit_button("Submit") if "load_state" not in st.session_state: st.session_state.load_state = False if submitted or st.session_state.load_state: st.session_state.load_state = True user = str(st.session_state[user_name_rev]) movies = str(st.session_state[selected_movie]) rate = st.session_state[slider_val] review = str(st.session_state[movie_rev]) insert_review(user, movies, rate, review) st.write("Your review is saved")
报错栈信息
KeyError: 'st.session_state has no key "yy". Did you forget to initialize it? More info: https://docs.streamlit.io/library/advanced-features/session-state#initialization' Traceback: File "c:\users\yaagik\pycharmprojects\pythonproject\venv\lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 564, in _run_script exec(code, module.__dict__) File "C:\Users\YAAGIK\PycharmProjects\pythonProject\new_test.py", line 77, in <module> user = str(st.session_state[user_name_rev]) File "c:\users\yaagik\pycharmprojects\pythonproject\venv\lib\site-packages\streamlit\runtime\state\session_state_proxy.py", line 89, in __getitem__ return get_session_state()[key] File "c:\users\yaagik\pycharmprojects\pythonproject\venv\lib\site-packages\streamlit\runtime\state\safe_session_state.py", line 110, in __getitem__ return self._state[key] File "c:\users\yaagik\pycharmprojects\pythonproject\venv\lib\site-packages\streamlit\runtime\state\session_state.py", line 439, in __getitem__ raise KeyError(_missing_key_error_message(key))
错误原因
误将表单输入变量的值作为st.session_state的键来访问,而非直接使用表单输入变量本身。比如用户输入用户名"yy"后,代码尝试访问st.session_state["yy"],但这个键从未在session_state中初始化,因此触发KeyError。
Streamlit的表单组件(如st.text_input、st.selectbox)会直接将用户输入的值返回给变量,不需要通过st.session_state二次获取。
解决方案
直接使用表单组件返回的变量值,移除多余的st.session_state[]包裹,同时注意避免覆盖全局变量:
if selected == "Review": st.title("Reviews") with st.form("my_form"): st.write("Type your Review") user_name_rev = st.text_input("User Name") movie_list = movies['title'].values selected_movie = st.selectbox( "Type or select a movie from the dropdown", movie_list ) slider_val = st.slider("Rating", 1, 10) movie_rev = st.text_area("Write your review") submitted = st.form_submit_button("Submit") if "load_state" not in st.session_state: st.session_state.load_state = False if submitted or st.session_state.load_state: st.session_state.load_state = True # 直接使用变量本身,无需从session_state获取 user = str(user_name_rev) selected_movie_str = str(selected_movie) # 重命名避免覆盖全局movies变量 rate = slider_val review = str(movie_rev) insert_review(user, selected_movie_str, rate, review) st.write("Your review is saved")
内容的提问来源于stack exchange,提问作者Yaagik Maurya 7
相关产品推荐
相关产品推荐

