如何在Streamlit表单提交后实现确认消息与按钮功能?
解决Streamlit表单提交后确认流程失效问题
问题根源
原代码的核心问题在于Streamlit的页面重运行机制:每次点击按钮(包括表单提交和确认按钮),整个脚本都会重新执行一次。当你点击表单的Submit按钮后,脚本运行到确认逻辑并显示Confirm按钮,但此时confirmation变量初始为False,代码执行if not confirmation: return直接终止流程;而当你点击Confirm按钮时,页面重新加载,之前的表单输入数据和提交状态全部丢失,导致后续逻辑无法触发。
解决方案
利用Streamlit的st.session_state持久化表单数据和流程状态,确保页面重运行时数据不丢失,完整流转「提交→确认→执行操作」的全流程。
修正后的完整代码
import streamlit as st import requests categories = { "CategoryA": "categorya", "CategoryB": "categoryb", "others": "others" } # 初始化Session State变量,确保页面刷新时数据不丢失 if "form_submitted" not in st.session_state: st.session_state.form_submitted = False if "item_data" not in st.session_state: st.session_state.item_data = {} if "need_confirmation" not in st.session_state: st.session_state.need_confirmation = False def create_item(): with st.form("create_item"): item_name = st.text_input("Item Name") category = st.selectbox(label="Category", options=categories.keys()) submitted = st.form_submit_button(label="Submit") if submitted: # 表单提交后,将数据存入Session State,标记提交状态 st.session_state.item_data = { "item_name": item_name, "category": category } st.session_state.form_submitted = True # 判断是否需要二次确认 if item_name and category == "others": st.session_state.need_confirmation = True else: # 无需确认,直接执行创建操作 execute_create_item(st.session_state.item_data) # 重置状态,回到初始表单 reset_session_state() # 封装数据创建/更新的API请求逻辑 def execute_create_item(item_data): body = { "item_name": item_data["item_name"], "category": categories[item_data["category"]] } try: reply = requests.post( url="some.url/item", headers={"auth": auth}, # 确保auth变量已提前定义 json=body, ) if reply.ok: st.success("Successfully added item!") elif reply.status_code == 409: st.error("Already exist!") else: st.error(f"Failed to create item: {reply.status_code}") except Exception as e: st.error(f"Request error: {str(e)}") # 重置Session State状态 def reset_session_state(): st.session_state.form_submitted = False st.session_state.item_data = {} st.session_state.need_confirmation = False # 处理二次确认流程 if st.session_state.form_submitted and st.session_state.need_confirmation: item_data = st.session_state.item_data st.warning(f"You are adding item '{item_data['item_name']}' to others category. Please confirm if this is correct") # 布局确认/取消按钮 col1, col2 = st.columns(2) with col1: if st.button("Confirm"): execute_create_item(item_data) reset_session_state() with col2: if st.button("Cancel"): reset_session_state() # 渲染表单 create_item()
关键优化点
- Session State持久化:用
st.session_state存储表单提交状态、输入数据和确认需求,避免页面刷新后数据丢失。 - 流程解耦:将表单提交、确认判断、API请求拆分为独立逻辑,避免单次运行时流程中断。
- 状态重置:操作完成或取消后,重置Session State回到初始表单状态,避免重复执行逻辑。
- 异常捕获:加入API请求的异常处理,覆盖网络错误等场景,提升稳定性。
内容的提问来源于stack exchange,提问作者vinci2quick
相关产品推荐
相关产品推荐

