Secrets management
在git仓库中存储未加密的密钥是一种不良实践。对于需要访问敏感凭证的应用程序,推荐的解决方案是将这些凭证存储在仓库外部——例如使用未提交到仓库的凭证文件或将它们作为环境变量传递。
Streamlit 提供了基于文件的原生密钥管理功能,可以轻松存储并安全访问您在 Streamlit 应用中的密钥。
注意
现有的秘密管理工具,例如dotenv文件、AWS凭证文件、Google Cloud Secret Manager或Hashicorp Vault,在Streamlit中都可以正常工作。我们只是在需要时添加了原生的秘密管理功能。
How to use secrets management
Develop locally and set up secrets
Streamlit 提供了两种使用 TOML 格式在本地设置密钥的方法:
-
在全局密钥文件中,位于
~/.streamlit/secrets.toml(macOS/Linux)或%userprofile%/.streamlit/secrets.toml(Windows):# 此部分中的所有内容将作为环境变量可用 db_username = "Jane" db_password = "mypassword" # 如果你愿意,也可以添加其他部分。 # 如下所示的部分内容不会成为环境变量, # 但它们仍然可以在Streamlit中轻松访问,如我们稍后在本文档中所示。 [my_other_secrets] things_i_like = ["Streamlit", "Python"]如果你使用全局密钥文件,当多个Streamlit应用程序共享相同的密钥时,你不必在多个项目级文件中重复密钥。
-
在每个项目的密钥文件中,位于
$CWD/.streamlit/secrets.toml,其中$CWD是您运行Streamlit的文件夹。如果全局密钥文件和每个项目的密钥文件都存在,每个项目文件中的密钥将覆盖全局文件中定义的密钥。
重要
将此文件添加到您的.gitignore中,这样您就不会提交您的秘密!
Use secrets in your app
通过查询st.secrets字典或作为环境变量来访问您的秘密。例如,如果您输入了上面部分的秘密,下面的代码将向您展示如何在您的Streamlit应用程序中访问它们。
import streamlit as st
# Everything is accessible via the st.secrets dict:
st.write("DB username:", st.secrets["db_username"])
st.write("DB password:", st.secrets["db_password"])
# And the root-level secrets are also accessible as environment variables:
import os
st.write(
"Has environment variables been set:",
os.environ["db_username"] == st.secrets["db_username"],
)
提示
你可以通过属性符号(例如 st.secrets.key)访问 st.secrets,也可以通过键符号(例如 st.secrets["key"])访问 — 就像 st.session_state 一样。
你甚至可以紧凑地使用TOML部分来将多个秘密作为单个属性传递。考虑以下秘密:
[db_credentials]
username = "my_username"
password = "my_password"
与其将每个秘密作为函数的属性传递,你可以更紧凑地传递部分内容以达到相同的结果。请参见下面的概念代码,它使用了上述的秘密:
# Verbose version
my_db.connect(username=st.secrets.db_credentials.username, password=st.secrets.db_credentials.password)
# Far more compact version!
my_db.connect(**st.secrets.db_credentials)
Error handling
以下是使用秘密管理时可能遇到的一些常见错误。
-
如果在应用程序运行时创建了
.streamlit/secrets.toml文件,则需要重新启动服务器以使更改在应用程序中生效。 -
如果您尝试访问一个秘密,但没有
secrets.toml文件存在,Streamlit 将引发一个FileNotFoundError异常:
-
如果您尝试访问一个不存在的密钥,Streamlit 将引发一个
KeyError异常:import streamlit as st st.write(st.secrets["nonexistent_key"])
Use secrets on Streamlit Community Cloud
当您将应用程序部署到Streamlit Community Cloud时,您可以使用与本地相同的秘密管理工作流程。但是,您还需要在社区云秘密管理控制台中设置您的秘密。通过云特定的秘密管理文档了解如何操作。
还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。