Streamlit入门 中文文档
基础概念
使用 Streamlit 进行开发非常简单。首先,在普通的 Python 脚本中添加几条 Streamlit 命令,然后使用 streamlit run
命令来运行它:
streamlit run your_script.py [-- script args]
一旦按照上述方式运行脚本,本地的 Streamlit 服务器就会启动,您的应用程序将会在您默认的网络浏览器的新标签页中打开。该应用程序就是您的画布,您可以在其中绘制图表、文本、控件、表格等等。
在该应用程序中绘制的内容由您决定。例如,st.text
会将原始文本写入您的应用程序,而 st.line_chart
则会绘制一条折线图。
请参考 API 文档,以了解您可用的所有命令。
在传递脚本的自定义参数时,这些参数必须在两个连字符之后进行传递。否则,这些参数会被视为对 Streamlit 本身的参数。
另一种运行 Streamlit 的方式是将其作为 Python 模块来运行。在将像 PyCharm 这样的集成开发环境与 Streamlit 配合使用时,这种方式会非常有用:
# Running
python -m streamlit run your_script.py
# is equivalent to:
streamlit run your_script.py
You can also pass a URL to streamlit run! This is great when combined with GitHub Gists.
For example:
streamlit
run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/streamlit_app.py
开发流程
每次您想要更新应用程序时,请先保存源文件。完成此操作后,Streamlit 会检测是否有更改,并询问您是否要重新运行应用程序。在屏幕的右上角选择“始终重新运行”,即可每次更改源代码时自动更新应用程序。
这能让您在一个快速的交互循环中进行操作:您输入一些代码,保存它,实时试运行,然后继续输入更多代码,保存并再次试运行,如此反复,直到您对结果满意为止。这种在编码与实时查看结果之间紧密相连的循环是 Streamlit 让您的生活更轻松的一种方式。
在开发 Streamlit 应用程序时,建议将编辑器窗口和浏览器窗口并排排列,以便同时查看代码和应用程序。来试试看吧!
自 Streamlit 版本 1.10.0 及更高版本起,Streamlit 应用程序无法在 Linux 发行版的根目录下运行。如果您尝试从根目录运行 Streamlit 应用程序,Streamlit 将抛出 FileNotFoundError: [Errno 2] No such file or directory
的错误。如需更多信息,请参阅 GitHub issue #5239。
如果您使用的是 Streamlit 1.10.0 或更高版本,您的主脚本应位于根目录之外的目录中。在使用 Docker 时,您可以使用 WORKDIR
命令来指定主脚本所在的目录。有关如何进行此操作的示例,请阅读 创建 Dockerfile。
数据流
Streamlit 的架构使您能够以编写普通 Python 脚本的方式来编写应用程序。要实现这一点,Streamlit 应用程序具有独特的数据流:每当需要在屏幕上更新内容时,Streamlit 都会从顶部到底部重新运行您的整个 Python 脚本。
这种情况可能会在以下两种情形下发生:
- 每当您修改应用程序的源代码时。
- 每当用户与应用程序中的小部件进行交互时。例如,当拖动滑块、在输入框中输入文本,或者点击按钮时。
每当通过 on_change
(或 on_click
)参数将回调函数传递给一个控件时,该回调函数总是会先于脚本的其余部分运行。有关回调函数 API 的详细信息,请参阅我们的 会话状态 API 参考指南。
为了使这一切实现快速且流畅的运行,Streamlit 在幕后为你承担了大量工作。在这个过程中,一个重要的角色是 @st.cache_data
装饰器,它能让开发者在应用程序重新运行时跳过某些耗时的计算。我们将在本页面的后面部分详细介绍缓存机制。
显示风格化的信息
在 Streamlit 应用程序中,有几种方式可以展示数据(表格、数组、数据框)。下面,您将了解到魔法命令和 st.write()
函数,它们可用于书写从文本到表格的各种内容。接下来,让我们来看看专门用于可视化数据的方法。
使用魔法
您还可以无需调用任何 Streamlit 方法即可向您的应用程序写入数据。Streamlit 支持“魔法命令”,这意味着您根本无需使用 st.write()
函数!要实际查看效果,请尝试以下代码片段:
"""
# My first app
Here's our first attempt at using data to create a table:
"""
import streamlit as st
import pandas as pd
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
df
只要 Streamlit 在同一行中看到一个变量或一个常量值,它就会自动使用 st.write()
函数将其写入你的应用程序中。如需了解更多信息,请参考关于 魔法命令的文档。
展示 Data frame
除了 魔法命令 之外,st.write()
是Streamlit 的“万能工具”。您可以将几乎任何内容传递给 st.write()
:文本、数据、Matplotlib 图形、Altair 图表等等。别担心,Streamlit 会自行处理并以正确的方式呈现这些内容。
import streamlit as st
import pandas as pd
st.write("Here's our first attempt at using data to create a table:")
st.write(pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
}))
还有其他一些专门用于处理数据的功能,例如 st.dataframe()
和 st.table()
,您也可以利用它们来展示数据。接下来让我们了解一下何时应使用这些功能,以及如何为数据框添加颜色和样式。
你可能会自问:“为什么我不总是使用 st.write() 函数呢?” 其实有以下几个原因:
- 魔法和
st.write()
会检查您传入的数据的类型,然后决定如何在应用程序中以最佳方式呈现这些数据。有时您可能希望以不同的方式呈现数据。例如,您可能不想将数据框以交互式表格的形式呈现,而是希望使用st.table(df)
将其呈现为静态表格。 - 第二个原因是,其他方法会返回一个可以使用和修改的对象,可以通过向其添加数据或替换数据来进行操作。
- 最后,如果您使用更具体的 Streamlit 方法,可以传递额外的参数来定制其行为。
例如,让我们创建一个数据框,并使用 Pandas Styler
对象更改其格式。在这个例子中,您将使用 NumPy 生成一个随机样本,并使用 st.dataframe()
方法绘制一个交互式表格。
此示例使用 Numpy 生成随机样本,但您也可以使用 Pandas DataFrame、Numpy Array 或普通的 Python 数组。
import streamlit as st
import numpy as np
dataframe = np.random.randn(10, 20)
st.dataframe(dataframe)
让我们以第一个示例为例,利用 Pandas 的 Styler
对象来突出显示交互式表格中的某些元素。
import streamlit as st
import numpy as np
import pandas as pd
dataframe = pd.DataFrame(
np.random.randn(10, 20),
columns=('col %d' % i for i in range(20)))
st.dataframe(dataframe.style.highlight_max(axis=0))
Streamlit 还提供了一种生成静态表格的方法:st.table()
。
import streamlit as st
import numpy as np
import pandas as pd
dataframe = pd.DataFrame(
np.random.randn(10, 20),
columns=('col %d' % i for i in range(20)))
st.table(dataframe)
展示图表
Streamlit
支持多种流行的数据图表库,例如 Matplotlib、Altair、deck.gl 等。在本节中,您将为您的应用程序添加一个柱状图、折线图和一张地图。
绘制折线图
您可以通过调用 st.line_chart()
函数轻松地将折线图添加到您的应用程序中。我们将使用 NumPy 生成一个随机样本,然后将其绘制出来。
import streamlit as st
import numpy as np
import pandas as pd
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
st.line_chart(chart_data)
绘制地图
使用 st.map()
函数,您可以将数据点显示在地图上。让我们使用 NumPy 生成一些示例数据,并将其绘制在旧金山的地图上。
import streamlit as st
import numpy as np
import pandas as pd
map_data = pd.DataFrame(
np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
columns=['lat', 'lon'])
st.map(map_data)
控件
当您将数据或模型调整到您想要探索的状态后,就可以添加诸如 st.slider()
、st.button()
或 st.selectbox()
这样的组件了。操作起来非常简单——将这些组件视为变量即可:
import streamlit as st
x = st.slider('x') # this is a widget
st.write(x, 'squared is', x * x)
首次运行时,上述应用程序应输出文本“0 的平方是 0”。然后,每当用户与某个控件进行交互时,Streamlit 就会从顶部开始重新运行您的脚本,并在此过程中将控件的当前状态赋值给您的变量。
例如,如果用户将滑块移动到位置 10
,Streamlit 将会重新运行上述代码,并将 x
设为 10
。所以现在您应该能看到文字“10 的平方是 100”。
此外,您还可以通过按键来访问这些小部件。如果您选择指定一个字符串作为该小部件的唯一标识符,那么就可以通过按键来访问它了:
import streamlit as st
st.text_input("Your name", key="name")
# You can access the value at any point with:
st.session_state.name
每个带有键的控件都会自动被添加到会话状态中。有关会话状态、其与控件状态的关联以及其限制的更多信息,请参阅 会话状态
API 参考指南。
使用复选框来显示 / 隐藏数据
复选框的一个应用场景是在应用程序中隐藏或显示特定的图表或部分。st.checkbox()
函数接受一个参数,即控件标签。在本示例中,复选框用于切换一个条件语句。
import streamlit as st
import numpy as np
import pandas as pd
if st.checkbox('Show dataframe'):
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
chart_data
使用选择框来设置选项
使用 st.selectbox
来从一系列选项中进行选择。您可以输入自己想要的选项,或者传入一个数组或数据框的列。让我们使用之前创建的 df
Data Frame。
import streamlit as st
import pandas as pd
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
option = st.selectbox(
'Which number do you like best?',
df['first column'])
'You selected: ', option
布局
Streamlit 使得通过 st.sidebar
将您的组件组织在左侧边栏中变得十分简便。传递给 st.sidebar
的每个元素都会固定在左侧,这样用户就能专注于应用程序中的内容,同时仍能访问用户界面控件。例如,如果您想在侧边栏中添加一个下拉框和一个滑块,应使用 st.sidebar.slider
和 st.sidebar.selectbox
而不是 st.slider
和 st.selectbox
:
import streamlit as st
# Add a selectbox to the sidebar:
add_selectbox = st.sidebar.selectbox(
'How would you like to be contacted?',
('Email', 'Home phone', 'Mobile phone')
)
# Add a slider to the sidebar:
add_slider = st.sidebar.slider(
'Select a range of values',
0.0, 100.0, (25.0, 75.0)
)
在侧边栏之外,Streamlit 还提供了其他几种控制应用程序布局的方法。st.columns
可让您将控件并排排列,而 st.expander
则让您通过隐藏大型内容来节省空间。
import streamlit as st
left_column, right_column = st.columns(2)
# You can use a column just like st.sidebar:
left_column.button('Press me!')
# Or even better, call Streamlit functions inside a "with" block:
with right_column:
chosen = st.radio(
'Sorting hat',
("Gryffindor", "Ravenclaw", "Hufflepuff", "Slytherin"))
st.write(f"You are in {chosen} house!")
目前,
st.echo
和st.spinner
不支持在侧边栏或布局选项中使用。不过请放心,我们正在努力为其添加支持功能!
展示进度
首先,让我们导入时间模块。我们将使用 time.sleep()
方法来模拟一个耗时较长的计算过程:
import time
现在,让我们来创建一个进度条:
import streamlit as st
import time
'Starting a long computation...'
# Add a placeholder
latest_iteration = st.empty()
bar = st.progress(0)
for i in range(100):
# Update the progress bar with each iteration.
latest_iteration.text(f'Iteration {i + 1}')
bar.progress(i + 1)
time.sleep(0.1)
'...and now we\'re done!'
进阶概念
既然您已经了解了 Streamlit 应用程序的运行方式以及其数据处理机制,那么现在让我们来谈谈如何提高效率吧。缓存功能可以让您保存函数的输出结果,这样在重新运行时就可以跳过这部分内容。会话状态则允许您为每个用户保存相关信息,并在重新运行时保持这些信息的完整性。这不仅能让您避免不必要的计算,还能让您创建动态页面并处理渐进式流程。
缓存 Caching
缓存技术能让您的应用程序在从网络加载数据、处理大型数据集或执行复杂计算时仍能保持高效运行。
缓存的基本原理是将昂贵函数调用的结果进行存储,当相同的输入再次出现时,就返回已缓存的结果。这样可以避免对具有相同输入值的函数进行重复执行。
要在 Streamlit 中对一个函数进行缓存,您需要为其应用一个缓存装饰器。你有两个选择:
st.cache_data
是用于缓存返回数据的计算的推荐方法。当您使用返回可序列化数据对象(例如字符串、整数、浮点数、数据框、字典、列表)的函数时,请使用st.cache_data
。** 它会在每次函数调用时创建数据的新副本 **,从而使其能够抵御 数据修改和竞争条件。大多数情况下,st.cache_data
的行为正是您所期望的——所以如果您不确定,可以先使用st.cache_data
看看是否有效!st.cache_resource
是用于缓存全局资源(如机器学习模型或数据库连接)的推荐方法。当您的函数返回不可序列化的对象(您不想多次加载这些对象)时,请使用st.cache_resource
。** 它会返回缓存的对象本身 **,该对象在所有重新运行和会话中共享,而无需复制或重复。如果使用st.cache_resource
缓存的对象被修改,那么这种修改将在所有重新运行和会话中都存在。
示例:
@st.cache_data
def long_running_function(param1, param2):
return …
在上述示例中,long_running_function
被 @st.cache_data
装饰器修饰。因此,Streamlit 会记录以下内容:
- 该函数的名称(
long_running_function
)。 - 输入值(
param1
、param2
)的值。 - 函数内部的代码。
在运行 long_running_function
内的代码之前,Streamlit 会检查其缓存中是否存在之前保存的结果。如果在给定的函数和输入值中找到了缓存结果,它将返回该缓存结果,而不会重新运行函数的代码。否则,Streamlit 会执行该函数,将结果保存到其缓存中,并继续运行脚本。在开发过程中,当函数代码发生变化时,缓存会自动更新,确保最新的更改反映在缓存中。
欲了解更多关于 Streamlit 缓存装饰器、其配置参数以及其限制的信息,请参阅 缓存部分。
会话状态 Session State
会话状态提供了一种类似字典的接口,您可以在脚本重新运行时保存相关信息。使用 st.session_state
并结合键或属性表示法来存储和调用值。例如,st.session_state["my_key"]
或 st.session_state.my_key
。请记住,组件会自行处理其状态性,因此您并不总是需要使用会话状态!
什么是会话?
会话指的是对一个应用程序进行单次浏览的过程。如果您在浏览器的两个不同标签页中访问同一个应用程序,那么每个标签页都会拥有自己的会话。因此,每个应用程序的使用者都会有一个与他们特定浏览情况相关的会话状态。在用户与应用程序进行交互的过程中,Streamlit 会维护这个会话。如果用户刷新浏览器页面或重新输入应用程序的 URL 进行加载,他们的会话状态就会重置,然后他们将从一个新的会话开始。
使用会话状态的示例
这里有一个简单的应用程序,用于统计页面被运行的次数。每次点击按钮时,脚本都会重新运行。
import streamlit as st
if "counter" not in st.session_state:
st.session_state.counter = 0
st.session_state.counter += 1
st.header(f"This page has run {st.session_state.counter} times.")
st.button("Run it again")
- ** 首次运行:**
对于每个用户而言,应用程序首次运行时,会话状态为空。因此,会创建一个键值对("counter": 0
)。随着脚本的继续执行,计数器会立即增加("counter": 1
),并显示结果:“此页面已运行 1 次。”当页面完全渲染完毕后,脚本结束,Streamlit 服务器等待用户进行操作。当该用户点击按钮时,重新运行开始。 - ** 第二次运行:**
由于“计数器”已在会话状态中作为关键项存在,因此无需重新初始化。随着脚本的继续执行,计数器会递增("counter": 2
),并显示结果:“此页面已运行 2 次。”
在以下几种常见情况下,会话状态会非常有用。如上所述,当您有一个逐步进行的过程,并希望从一次运行延续到下一次运行时,会话状态就会被使用。会话状态还可以用于避免重新计算,这与缓存类似。不过,其中的区别很重要:
- 缓存会将存储的值与特定的函数和输入进行关联。缓存的值对所有用户在所有会话中都是可访问的。
- 会话状态将存储的值与键(字符串)关联起来。会话状态中的值仅在保存该值的单个会话中可用。
如果您的应用程序中有随机数生成功能,您可能会选择使用会话状态。下面是一个示例,其中在每个会话开始时随机生成数据。通过将这些随机信息保存在会话状态中,每个用户在打开应用程序时都会获得不同的随机数据,但在他们与应用程序进行交互时,这些数据不会持续变化。如果您使用选择器选择不同的颜色,您会看到数据不会随着每次重新运行而重新随机化。(如果您在新标签页中打开应用程序以开始新会话,您会看到不同的数据!)
import streamlit as st
import pandas as pd
import numpy as np
if "df" not in st.session_state:
st.session_state.df = pd.DataFrame(np.random.randn(20, 2), columns=["x", "y"])
st.header("Choose a datapoint color")
color = st.color_picker("Color", "#FF0000")
st.divider()
st.scatter_chart(st.session_state.df, x="x", y="y", color=color)
如果您为所有用户都获取相同的数据,那么您可能会缓存一个能够获取这些数据的函数。而如果您要获取针对特定用户的特定数据,比如查询他们的个人资料,您可能需要将这些数据保存在会话状态中。这样,所查询的数据仅在该一个会话中可用。
正如在“基本概念”中所提到的,会话状态也与小部件有关。小部件具有神奇的功能,并能自行处理状态性问题。然而,作为一种高级功能,您可以通过为小部件分配键来在代码中操作其值。任何分配给小部件的键都会成为与该小部件值相关联的会话状态中的一个键。这可用于操作小部件。在您完全理解 Streamlit 的基础知识后,请查看我们的关于 小部件行为 的指南,如果您感兴趣的话,可以深入研究其中的细节。
连接 Connection
如上文所述,您可以使用 @st.cache_resource
来缓存连接。这是最通用的解决方案,允许您使用几乎任何来自任何
Python 库的连接。然而,Streamlit 还提供了一种方便的方式来处理一些最常用的连接,比如 SQL!
st.connection
会为您处理缓存事宜,因此您可以编写更少的代码。从您的数据库获取数据可以非常简单,例如:
import streamlit as st
conn = st.connection("my_database")
df = conn.query("select * from my_table")
st.dataframe(df)
当然,您可能会想知道您的用户名和密码都存放在哪里。Streamlit 提供了一种便捷的 机密管理机制。目前,我们先来看看 st.connection
如何与机密信息完美配合使用。在您的本地项目目录中,可以创建一个名为 .streamlit/secrets.toml
的文件。您将机密信息保存在这个 toml 文件中,而 st.connection
就会直接使用这些信息!例如,如果您有一个名为 streamlit_app.py
的应用程序文件,那么您的项目目录可能如下所示:
your-LOCAL-repository/
├── .streamlit/
│ └── secrets.toml # Make sure to gitignore this!
└── streamlit_app.py
对于上述的 SQL 示例,您的 secrets.toml 文件可能如下所示:
[connections.my_database]
type="sql"
dialect="mysql"
username="xxx"
password="xxx"
host="example.com" # IP or URL
port=3306 # Port number
database="mydb" # Database name
既然您不想将包含机密信息的 secrets.toml
文件提交到您的代码库中,那么在准备发布您的应用程序时,您就需要了解您的主机系统是如何处理这些机密信息的。每个主机平台可能都有不同的方法让您传递这些机密信息。例如,如果您使用的是 Streamlit
社区云,每个部署的应用程序都有一个设置菜单,您可以在其中加载您的机密信息。在编写完应用程序并准备部署之后,您可以阅读有关如何在社区云上 部署应用程序
的全部内容。
其它特性
您已经详细了解了 Streamlit 的基本概念,并且也对高级概念中的缓存和会话状态有所了解。但除此之外还有哪些特色功能呢?下面让我们快速了解一下一些额外的功能,以帮助您的应用程序更上一层楼。
主题
Streamlit 本身就支持浅色和深色两种主题。Streamlit 会首先检查正在查看应用程序的用户是否通过其操作系统和浏览器设置了浅色或深色模式的偏好设置。如果有这样的设置,那么就会使用该偏好设置。否则,将默认应用浅色主题。
您还可以通过点击“⋮”选项,然后选择“设置”来更改当前的主题。
想要为应用程序添加自己的主题吗?“设置”菜单中有一个主题编辑器,可通过点击“编辑当前主题”来访问。您可以使用这个编辑器尝试不同的颜色,并实时查看您的应用程序的更新效果。
当您对工作内容感到满意时,可以通过在 主题配置 部分中设置配置选项来保存主题。在为您的应用程序定义了主题后,该主题将在主题选择器中显示为“自定义主题”,并且会默认应用,而不是使用内置的浅色和深色主题。
有关定义主题时可用选项的更多详细信息,请参阅主题选项文档。
主题编辑器菜单仅在本地开发环境中可用。如果您使用 Streamlit 社区云部署了您的应用程序,那么“编辑当前主题”按钮将不再出现在“设置”菜单中。
另一种尝试不同主题颜色的方法是开启“Run on save”选项,编辑
config.toml
文件,然后就会看到你的应用程序会重新运行,并应用新的主题颜色。
页面
随着应用程序规模的扩大,将其划分为多个页面会变得很有用。这样既便于开发者进行管理,也便于用户进行操作。Streamlit 提供了一种强大的方法,通过使用 st.Page
和 st.navigation
来创建多页面应用程序。只需创建页面并按照以下方式将其通过导航连接起来即可:
- 创建一个入口脚本,用于定义并连接你的页面。
- 为每个页面的内容创建单独的 Python 文件。
- 使用
st.Page
来定义页面,并使用st.navigation
来连接它们。
以下是一个包含三个页面的应用程序示例:
# streamlit_app.py
import streamlit as st
# Define the pages
main_page = st.Page("main_page.py", title="Main Page", icon="")
page_2 = st.Page("page_2.py", title="Page 2", icon="️")
page_3 = st.Page("page_3.py", title="Page 3", icon="")
# Set up navigation
pg = st.navigation([main_page, page_2, page_3])
# Run the selected page
pg.run()
# main_page.py
import streamlit as st
# Main page content
st.markdown("# Main page ")
st.sidebar.markdown("# Main page ")
# page_2.py
import streamlit as st
st.markdown("# Page 2 ️")
st.sidebar.markdown("# Page 2 ️")
# page_3.py
import streamlit as st
st.markdown("# Page 3 ")
st.sidebar.markdown("# Page 3 ")
现在运行streamlit run streamlit_app.py
命令,即可查看您全新的多页面应用程序!导航菜单会自动出现,用户可以借此在不同页面之间切换。
我们关于多页面应用程序的文档会教您如何向您的应用程序添加页面,包括如何定义页面、构建结构以及运行多页面应用程序,以及如何在页面之间进行导航。一旦您掌握了基础知识,就可以创建您的第一个多页面应用程序了!
自定义组件
如果您在 Streamlit 库中找不到所需的组件,可以尝试使用自定义组件来扩展 Streamlit 的内置功能。在组件库中探索并浏览那些由社区创建的热门组件。如果您涉足前端开发领域,还可以使用 Streamlit 的组件 API 自行构建自定义组件。
静态文件服务
正如您在“Streamlit 基础知识”中所了解到的那样,Streamlit 会运行一个服务器,客户端会连接到该服务器。这意味着您的应用程序的用户无法直接访问本地存储的文件。大多数情况下,这并不重要,因为 Streamlit 命令会为您处理这些事宜。当您使用 st.image(<图片路径>)
时,Streamlit 服务器将访问该文件并处理必要的托管事宜,以便您的应用程序用户能够看到该图片。然而,如果您想要一个直接指向图片或文件的 URL,您就需要进行托管操作。这需要设置正确的配置,并将托管的文件放置在名为static
的目录中。例如,您的项目可能如下所示:
your-project/
├── static/
│ └── my_hosted-image.png
└── streamlit_app.py
欲了解更多信息,请阅读我们的关于静态文件服务的指南。
应用程序测试
良好的开发规范包括对代码进行测试。自动化测试能帮助您编写更高质量的代码,而且速度更快!Streamlit 有一个内置的测试框架,让您能够轻松构建测试。您可以使用您喜欢的测试框架来运行测试。我们喜欢 pytest
。当您测试一个 Streamlit 应用程序时,您会模拟运行该应用程序,声明用户输入,并检查结果。您可以使用 GitHub 工作流来自动化您的测试,并获得有关破坏性更改的即时警报。请参阅我们的应用程序测试指南以了解更多信息。
总结
既然你已经对各个组成部分有了更多的了解,那么现在让我们把事情总结一下,回顾一下它们是如何协同工作的:
- Streamlit 应用程序是基于 Python 编写的脚本,从上到下运行。
- 每当用户打开指向您的应用程序的浏览器标签页时,该脚本就会被执行,并且一个新的会话就会启动。
- 在脚本执行的过程中,Streamlit 会实时在浏览器中绘制其输出内容。
- 每当用户与某个控件进行交互时,您的脚本就会重新执行,并且 Streamlit 会在浏览器中重新绘制其输出内容。
- 该控件的输出值与重新运行时的新值相匹配。
- 脚本使用 Streamlit 缓存来避免重复计算昂贵的函数,因此更新速度非常快。
- 会话状态允许您在重新运行时保存在重新运行之间持续存在的信息,当您需要的不仅仅是简单的控件时即可使用。
- Streamlit 应用程序可以包含多个页面,这些页面在名为
pages
的文件夹中的单独.py
文件中定义。
Streamlit入门 中文文档的更多相关文章
- IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据
IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据 原文:http://docs.identityserver.io/en/r ...
- IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端
IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端 原文:http://docs.identityserver.io/en/release/quicks ...
- IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity
IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity 原文:http://docs.identityserver.io/en/release ...
- IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问
IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问 原文:http://docs.identityserver.io/en/release/quickst ...
- IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持
IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持 原文:http://docs.identityserver.io/en/release/quickstarts/4_e ...
- IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证
IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...
- IdentityServer4 中文文档 -8- (快速入门)设置和概览
IdentityServer4 中文文档 -8- (快速入门)设置和概览 原文:http://docs.identityserver.io/en/release/quickstarts/0_overv ...
- IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API
IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API 原文:http://docs.identityserver.io/en/release/quickstarts/ ...
- IdentityServer4 中文文档 -10- (快速入门)使用密码保护API
IdentityServer4 中文文档 -10- (快速入门)使用密码保护API 原文:http://docs.identityserver.io/en/release/quickstarts/2_ ...
- 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明
以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...
随机推荐
- Stream流式编程工具类,开发必备
把自己写的流式编程工具分享出来,不涉及公司业务,非常便捷,不用在业务层看到一条龙式的Stream代码了: 大家用的最多的应该是转list,转set,以及setVFromE: 觉得好用点个赞就行 imp ...
- Git Reset 彻底解析:--hard 模式操作步骤、风险与完整恢复指北
结论先行 使用 git reset --hard <commit_id> 可强制将本地代码.暂存区.工作目录彻底回退到指定提交状态,但会丢弃目标提交之后的所有提交记录(需谨慎操作,尤其涉及 ...
- Mysql如何给字符串添加索引(前缀索引)
在日常开发中,我们经常给字符串添加索引,那么给字段添加索引有什么技巧吗,我们看看下面的例子,我们给一个邮箱添加索引,应该如何添加呢 看看下面这条sql select * from user where ...
- spring综合性利用工具-SpringBoot-Scan(一),附下载链接。
日常渗透过程中,经常会碰到Spring Boot搭建的微服务,于是就想做一个针对Spring Boot的开源渗透框架,主要用作扫描Spring Boot的敏感信息泄露端点,并可以直接测试Spring的 ...
- 【HUST】网络攻防实践|TCP会话劫持+序列号攻击netcat对话
文章目录 一.前言 1. 实验环境 2. 攻击对象 3. 攻击目的 4. 最终效果 docker的使用 新建docker docker常用指令 二.正式开始 过程记录 1. ARP欺骗 2. 篡改数据 ...
- 在ARM笔记本和KylinOS桌面操作系统上安装docker
目标 手头有一台华为L420笔记本,CPU为ARM(HUAWEI Kirin 9006C),OS为Kylin桌面操作系统V10(SP1),内核5.4.96,已激活. 需要安装docker,但在软件商店 ...
- stopPropagation()方法阻止父级事件
方式一 <div id="div1"> <div id="div2"></div> </div> $(" ...
- 「Log」做题记录 2023.10.30-2023.11.26
\(2023.10.30-2023.11.5\) \(\color{blueviolet}{AT\_abc285\_g}\) 神秘题. 网络流是显著的,建边方式如下: 所有边容量都为 \(1\). 每 ...
- 温州大学X袋鼠云:高等人才教育建设,如何做到“心中有数”
2022 年 4 月 16 日,神十三在东风着陆场预定区域成功着陆.接下来从 5 月开始,我国还将进行 6 次飞行任务,在今年内完成中国空间站的在轨建造.而以目前情况推测,在国际空间站退役后,中国空间 ...
- UFT 模拟鼠标(包括fireEvent) & 键盘操作
1. 鼠标 2. 键盘 3. UFT FireEvent 实现多样JS 操作