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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:42:10