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

Streamlit下载按钮点击后应用重载、输出丢失问题求助

问题解决:Streamlit下载按钮点击后应用重载导致输出消失

问题原因

Streamlit中所有交互组件(包括download_button)点击后都会触发应用全量重跑。你的代码中,处理后的_df1和_df2仅在点击Process按钮的代码块内生成,重跑后该代码块不再执行,因此表格和下载按钮会消失。

解决方案

使用Streamlit的Session State保存处理后的DataFrame,确保重跑时仍能读取到数据。修改后的完整代码如下:

import streamlit as st
import pandas as pd
import requests
import json
from datetime import datetime, timedelta,date
import time

# Mock function api_1
@st.cache_data
def api_1(text):
    # 模拟返回数据(补充原代码缺失的answers定义)
    answers = ["result1_" + t for t in text]
    df = pd.DataFrame({"text": text, "output1": answers})
    return df

# Mock function api_2
@st.cache_data
def api_2(text):
    # 模拟返回数据(补充原代码缺失的answers定义)
    answers = ["result2_" + t for t in text]
    df = pd.DataFrame({"text": text, "output2": answers})
    return df


# Streamlit UI layout
st.set_page_config(page_title="DEMO UI", layout="wide")
st.title("DEMO UI")

# 初始化Session State,保存处理后的DataFrame
if "_df1" not in st.session_state:
    st.session_state._df1 = None
if "_df2" not in st.session_state:
    st.session_state._df2 = None

# Side bar filters
st.sidebar.header("Filters")
text_input = st.sidebar.text_area("Enter text(s) (separated by line breaks)")
uploaded_file = st.sidebar.file_uploader("Upload CSV file with text", type=["csv"])
_name = st.sidebar.selectbox("Select Client Name", ["A", "B", "C"])
_experience = st.sidebar.selectbox("Select Experience", ["W", "A"])
_type = st.sidebar.selectbox("Select Type", ["p", "b"])
default_columns = ['.....','...']
cols=['.....','...','.....','...']
with st.sidebar:
    all_columns = st.multiselect("ChooseColumns", cols, default=default_columns)


# Button to trigger processing
if st.sidebar.button("Process"):
    try:
        if uploaded_file is not None:
            texts = uploaded_file.read().decode("utf-8-sig").split("\n")
        else:
            texts = text_input.split("\n")

        text = [text.strip() for text in texts if text.strip()]
        # 移除字符串首尾的双引号
        text=[u.replace('"', '') if (u.startswith('"') and u.endswith('"')) else u for u in text ]

        # 调用API并将结果存入Session State
        st.session_state._df1 = api_1(text)
        st.session_state._df2 = api_2(text)

    except Exception as e:
        st.error("An error occurred: {}".format(e))

# 独立渲染表格和下载按钮,依赖Session State中的数据
if st.session_state._df1 is not None:
    st.header("Response Tables")
    st.subheader("api_1")
    st.table(st.session_state._df1)
    st.download_button(
        label="Download 1",
        data=st.session_state._df1.to_csv(index=False, encoding="utf-8-sig"),
        file_name="file1.csv",
        key="key1"
    )

if st.session_state._df2 is not None:
    st.subheader("api_2")
    st.table(st.session_state._df2)
    st.download_button(
        label="Download 2",
        data=st.session_state._df2.to_csv(index=False, encoding="utf-8-sig"),
        file_name="file2.csv",
        key="key2"
    )

关键修改点

  • 初始化Session State:在应用启动时创建_df1和_df2的会话状态变量,默认值为None。
  • 保存处理结果:点击Process按钮后,将API返回的DataFrame存入st.session_state,而非仅存于局部变量。
  • 分离渲染逻辑:将表格和下载按钮的渲染代码从Process按钮的代码块中移出,改为判断Session State中的数据是否存在,确保重跑时仍能显示内容。

修改后,点击下载按钮触发重跑时,Session State中仍保留处理后的DataFrame,表格和下载按钮不会消失,可正常点击另一个下载按钮。

内容的提问来源于stack exchange,提问作者MAC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:44:56