如何在Streamlit应用中将表单数据以字典形式获取
Streamlit表单获取集合字典数据的实现方法
Streamlit原生表单对象没有直接提供form.data这类属性来一次性获取所有输入值,但可以通过以下两种简洁通用的方式实现需求:
方法一:利用st.session_state筛选表单数据
每个表单内的输入组件,只要指定了唯一key,其值会自动存入st.session_state。我们可以给表单内的组件key统一加上表单key作为前缀,提交时筛选出对应数据:
import streamlit as st import requests form = st.form(key="my_form") # 给所有表单输入组件添加统一前缀的key form.text_input("input 1", key="my_form_input_1") form.text_input("input 2", key="my_form_input_2") form.selectbox("选择选项", ["A", "B", "C"], key="my_form_select_1") # 更多输入组件... def submit(): # 从session_state中筛选当前表单的所有数据,去除前缀 form_data = { key.replace("my_form_", ""): value for key, value in st.session_state.items() if key.startswith("my_form_") } # 处理数据后发送请求 requests.post("localhost:5000/form-submit", data=form_data) form.form_submit_button("提交", on_click=submit)
方法二:封装组件创建与数据收集逻辑
如果需要更通用的封装,可以写一个辅助函数,在创建表单组件时同时记录key,提交时直接收集:
import streamlit as st import requests def create_form_with_data(form_key): form = st.form(key=form_key) component_keys = [] # 自定义创建组件的函数,记录key def add_text_input(label): key = f"{form_key}_{label.replace(' ', '_')}" component_keys.append(key) return form.text_input(label, key=key) # 添加表单组件 add_text_input("input 1") add_text_input("input 2") def submit(): form_data = {key.replace(f"{form_key}_", ""): st.session_state[key] for key in component_keys} requests.post("localhost:5000/form-submit", data=form_data) form.form_submit_button("提交", on_click=submit) # 使用封装好的函数 create_form_with_data("my_form")
这两种方法都能让你避免逐个定义变量,实现代码的简洁与通用化。
内容的提问来源于stack exchange,提问作者Peter Mølgaard Pallesen
相关产品推荐
相关产品推荐

