目录
前言
为了进一步使用streamlit进行安全开发,通过对streamlit的中文文档进行学习,通过博文对自己学习和过程中的笔记以及遇到的问题进行记录
在进行学习之前,因之前常用PyCharm进行python的编写,但是编写此类web应用的时候感觉过于繁琐与不便,因此就用vscode来做替代吧
1.准备工作
1.1 如何配置python环境
在vscode中搜索扩展python,找到如图所示的第一个,安装成功后,按照提示或者自行重启vscode
新建一个.py文件,然后输入下面的代码,点击如图所示的运行按钮,或是右键然后点击Run code进行运行代码
1.2 调出运行代码窗口
这里注意安装如下图所示,运行命令就不用每次重新打开命令窗口了,当然我这里使用了powershell(管理员界面)
如果没有使用的话,建议可以打开前通过右键软件,然后以管理员身份运行,当然,也可以在属性中的兼容性中,将其调为一直为管理员打开,具体可以直接搜索教程,很简单,这样不管是安装第三方还是使用命令,报错也会大大减少
2. Streamlit基础概念
2.1 Streamlit的命令启动使用
2.1.1 运行方式一
Streamlit的使用非常直观。首先,在一个标准的Python脚本中嵌入几个Streamlit命令,然后通过命令streamlit run
来启动它:
streamlit run 你的脚本.py [-- 脚本参数]
按照上面的方式运行脚本后,一个本地的Streamlit服务器随即启动,你的应用程序将在默认网页浏览器的新标签页中打开。这个应用程序如同一块画布,你可以在上面绘制图表、文本、小部件、表格等元素。
在应用中展示的内容完全由你决定。例如,st.write
用于向应用直接写入原始文本,下面用第一个实例来进行演示,创建你的第一个 Streamlit 应用
st.write用于向页面直接写入数据,类似于文件写入中的 python中的f.write()是写入文件中,这个是写在web页面的,如果懂java的话,就是response.getWriter() 获得到的对象 ,然后用out来代表对象 out.write("Hello world")在web页面写入数据
import streamlit as st # type: ignore
st.write("Hello World") # 向页面写入数据
streamlit run demo01.py # 后面是你的py脚本名
其中的# type: ignore是用来忽略警告的,因为vscode无法识别到这个安装在全局的库,直接忽略或者不用管,并不应响代码的使用
在弹出的浏览器窗口中可以看到
2.1.2 运行方式二
下面是开发文档中的一些内容,但是根据我来看开发文档出现了错误,应该是在一个破折号后,
当你向脚本传递自定义参数时,这些参数必须放在一个破折号之后。否则,这些参数会被解释为Streamlit本身的参数。
但是我感觉另一种方式不如在vscode或是IDE的终端中运行,毕竟还是少敲一点单词
另一种运行Streamlit的方法是将其作为Python模块来运行。这对于配置像PyCharm这样的IDE以支持Streamlit非常有用:
# 运行方式
python -m streamlit run 你的脚本.py
# 这等同于:
streamlit run 你的脚本.py
你还可以向streamlit run
传递URL!这在结合GitHub Gist时尤为有用。例如:
streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/streamlit_app.py
下面是开发文档一大堆文字,我对每个部分总结一段话,并进行介绍
2.2. 开发流程
,通俗来说就是,类似与Vite管理Vue应用类似,但是不是自动实时更新,而是保存后,会提醒你要改动"你是否更改并运行",基本上也算实时,意味着提高了开发效率,对我来说目前应用与win,和linux无关后面的问题对我来说不用关注了.
当更新应用时,只需保存源文件,系统会检测到变化并提示重新运行。选择"始终重新运行"可实现代码更改后的自动更新。这种快速迭代的工作方式,结合编辑器和浏览器的并排布局,提高了开发效率。注意,自1.10.0版本起,应用不能从Linux根目录运行,以避免权限问题和错误。使用Docker时,应通过WORKDIR指定主脚本的正确目录。
2.3 数据流
对于修改代码和进行组件互动时就会重新运行整个代码,这个可以根据Streamlit应用的刚开始的输入 streamlit hello 测试中的动画演示来理解 ,更改其中的参数,代码便会重新运行,对于重复的高强度的运算,可以通过缓存等进行跳过重复运算
Streamlit应用的架构通过重新运行整个Python脚本来更新屏幕上的内容,这在源代码修改或用户与小部件互动时都会发生。回调函数在脚本其余部分之前运行,而Streamlit通过@st.cache_data装饰器等机制在后台优化性能,允许跳过重复的高成本计算,确保应用的快速和无缝体验。
2.4 数据展示与样式
下面是文档中的一些实例,可以快速帮助我们熟悉Streamlit应用的一些基本语法和处理,当然基本上还是一写第三方库的使用,熟悉的话学起来就很简单了
在Streamlit应用中,有几种展示数据(如表格、数组、数据帧)的方法。下面将介绍魔法命令(magic)和st.write()
,它们可以用来书写从文本到表格的任何内容。之后,我们将探讨专为数据可视化设计的方法。
2.4.1 使用魔法命令¶
你也可以不调用任何Streamlit方法来向应用写入内容。Streamlit支持所谓的“魔法命令”,这意味着你不必使用st.write()
。下面的代码段展示了这一点:
下面就是使用了pandas库,进行了创建了表格,其中按照json格式或是叫python中的字典格式也行
"""
# 我的第一个应用
这是我们首次尝试使用数据创建表格:
"""
import streamlit as st # type: ignore #
import pandas as pd # type: ignore
df = pd.DataFrame({
'第一列': [1, 2, 3, 4],
'第二列': [10, 20, 30, 40]
})
df
每当Streamlit看到一个变量或字面值独立成行时,它就会自动使用st.write()
将内容写入你的应用。想了解更多,请参考magic命令的文档。
2.4.2 写入数据帧
除了魔法命令,st.write()
是Streamlit的“瑞士军刀”。几乎任何内容都可以传递给st.write()
:文本、数据、Matplotlib图形、Altair图表等等。放心,Streamlit会识别并正确渲染这些内容。
代码基本和上面一致,但是是通过st.write()进行写入到web页面的
import streamlit as st
import pandas as pd
st.write("这是我们首次尝试使用数据创建表格:")
st.write(pd.DataFrame({
'第一列': [1, 2, 3, 4],
'第二列': [10, 20, 30, 40]
}))
2.4.3 为什么不会一直使用st.write()
?
有几个原因:
- 魔法 和
st.write()
会检查你传递的数据类型,然后决定如何最好地在应用中呈现它。有时你可能想要用另一种方式展示。例如,与其将数据框作为交互式表格绘制,你可能希望通过使用st.table(df)
将其绘制为静态表格。 - 第二个原因是,其他方法返回的对象可以被使用和修改,无论是通过向其添加数据还是替换数据。
- 最后,如果你使用了更具体的Streamlit方法,你可以传递额外的参数来自定义它的行为。
2.4.4 小例子
创建一个数据框并使用Pandas的Styler
对象改变其格式。在这个例子中,使用Numpy第三方库生成随机样本,并使用st.dataframe()
方法绘制一个交互式表格。
其中 np.random.randn(10, 20)
生成了一个包含 10 行和 20 列的二维数组,数组中的数值来自标准正态分布(均值为 0,标准差为 1)。
import streamlit as st # type: ignore #
import numpy as np # type: ignore #
dataframe = np.random.randn(10, 20)
st.dataframe(dataframe)
让我们基于第一个例子进一步操作,使用Pandas的Styler
对象来突出显示交互式表格中的某些元素。
其中数据的创建还是使用numpy库的方法进行创建.其中通过columns=('列%d' % i for i in range(20))
设置数据框的列名为“列0”到“列19”。 看不懂的话,其中for循环使用的列表推导式,之前我有写过列表推导式的使用,感兴趣的话可以看看,然后就是使用了占位符将列表推导式,也就是每次循环的数据,在每一列进行展示.
其中dataframe.style.highlight_max(axis=0)
是Pandas的一个方法链,用于给数据框添加样式。这里highlight_max
函数用于突出显示每一列中的最大值。参数axis=0
指定了函数是沿着列的方向(垂直方向)查找最大值。
import streamlit as st
import numpy as np
import pandas as pd
dataframe = pd.DataFrame(
np.random.randn(10, 20),
columns=('列%d' % i for i in range(20)))
st.dataframe(dataframe.style.highlight_max(axis=0))
Streamlit还提供了一个生成静态表格的方法:st.table()
。
import streamlit as st # type: ignore #
import numpy as np # type: ignore #
import pandas as pd # type: ignore #
dataframe = pd.DataFrame(
np.random.randn(10, 20),
columns=('列%d' % i for i in range(20)))
st.table(dataframe)