跳转到主要内容

未提供项目描述

项目描述

streamlit-sync

一个用于在streamlit会话之间轻松同步仪表板的库。

import streamlit as st

import streamlit_sync

room_name = streamlit_sync.select_room_widget()

with streamlit_sync.sync(room_name):
    y = st.slider("Select a value")
    st.write(y, "squared is", y * y)

更完整的示例应用程序可以在./toy_example.py中找到。

为什么?

最初的目标是能够共享一个任何人都可以交互的仪表板。每个用户都可以看到其他用户对其仪表板的影响。

潜在用例包括

  • 在会议/演示中,它可以作为一个解决方案,避免让一个用户与所有人共享其屏幕并进行所有操作。
  • 可以通过这种方式实现小型游戏或聊天。
  • 它可以是一种“保存”本地演示中精确有趣参数的方法。目前,无法在本地驱动器上存储会话,但这应该是一个简单的改进。
  • 等。

免责声明

自行承担使用风险

  • streamlit-sync使用Streamlit的内部API,这些API并非面向公众。不能保证它在未来的版本中可以正常工作。
  • streamlit-sync并非特别高效。同步版本的仪表板是使用streamlit缓存的更好激励。
  • 当与大量并发会话一起使用时,此库的健壮性不能保证。
  • streamlit-sync没有经过充分的测试。它需要进行具有多个会话的端到端测试,但这尚未完成。

相关工作

(streamlit-server-state)是另一个做类似工作的库。它用于在服务器端状态。`streamlit-sync`的想法是同步小部件本身。

特性

线程安全

每个房间使用自己的锁(来自python threading库)。每次只能有一个会话可以读写房间中的值。我不知道如果大量会话连接到同一房间,这将如何影响可用性。

每个房间都会在内存中保存带有时间戳的最新值快照。一个会话只有在已经拥有最新数据的情况下才能更新值。这意味着如果两个不同的会话同时在对仪表板进行操作,则很可能有一个操作会丢失。

如何处理房间?

为了同步数据,您需要进入一个房间。最简单的方法是让每个会话使用同一个房间。

import streamlit as st

import streamlit_sync

with streamlit_sync.sync("default_room"):
    app()

从UI中选择房间

使用默认UI

另一种选择是使用 streamlit_sync.select_room_widget() 方法直接从UI中选择要进入的房间。它将在侧边栏创建一个简单的表单,您可以从列表中选择一个现有房间或创建一个新的房间。一旦进入房间,您就可以退出。房间中的值仍然保存在服务器上,但已从会话中删除。

import streamlit as st

import streamlit_sync

room_name = streamlit_sync.select_room_widget()

with streamlit_sync.sync(room_name):
    app()

注意:每个房间活跃会话的数量仅供参考,不一定总是准确。如果会话关闭,服务器只有在另一个会话触发了该房间的同步时才会注意到。

构建自己的UI

除了使用带有 select_room_widget 的默认UI,您还可以使用 streamlit_sync.rooms.enter_room(room_name)streamlit_sync.rooms.exit_room() 构建自己的UI。

如何仅同步特定的小部件/值?

默认情况下,所有小部件和值都会同步。您可以通过定义自己的非同步密钥将某些小部件限制为“私有”。

x = st.slider("Select a value", key=streamlit_sync.get_not_synced_key("key"))

对于状态值,这也是可能的。

synced_key = "my_custom_key"
username = streamlit_sync.get_not_synced_key("username")

st.session_state[synced_key] = 42 # All sessions will be synced with this value
st.session_state[username] = "Adrien Treuille" # Each session can store its own username

动作小部件

一些小部件在 streamlit-sync 中的处理方式略有不同,特别是按钮和表单。

按钮

为了避免重复操作,按钮永远不会与房间同步。为了同步按钮,您需要设置一个状态值。

在这个例子中,气球只会在点击按钮的会话中发送。

# Action is not shared !
if st.button(label="Send balloons"):
    st.balloons()

以下是一个同步操作结果的示例。

# Nb of clicks is synced, not the action. !
if st.session_state.get("NB_CLICKS") is None:
    st.session_state["NB_CLICKS"] = 0

if st.button(label="click"):
    st.session_state["NB_CLICKS"] += 1

st.write("Clicked **" + str(st.session_state["NB_CLICKS"]) + "** times !")

表单

只有在提交按钮被点击时,表单数据才会同步,这正是表单的预期用途。与按钮类似,“提交操作”不会同步,只有数据会同步。

注意:当前存在一个关于表单同步的bug。字段只在提交数据的会话中被清除。

未来改进

  • 测试库,特别是UI。目前,两个会话之间的同步只是手动测试的。
  • 提供一个选项,默认同步或不同步值。目前,默认同步所有值,除非明确指出为“不同步”。如果能够选择性地将所有值设置为私有,除非明确同步,那就更好了。
  • 将状态存储在本地驱动器上。这是我构建这个工具的主要目的之一。想法是能够存储和检索 streamlit 会话,即使是在重启之后。这很可能会在可序列化的数据上工作。
  • 有一个读写/只读机制,允许某些“管理员会话”与小部件交互,而某些“普通用户”只能看到当前的仪表板。
  • 欢迎提出其他想法:)

项目详情


下载文件

根据您的平台下载文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

streamlit-sync-0.1.0.tar.gz (11.5 kB 查看哈希值)

上传时间:

构建分布

streamlit_sync-0.1.0-py3-none-any.whl (10.8 kB 查看哈希)

上传时间: Python 3

由以下支持