Secrets management

在git仓库中存储未加密的密钥是一种不良实践。对于需要访问敏感凭证的应用程序,推荐的解决方案是将这些凭证存储在仓库外部——例如使用未提交到仓库的凭证文件或将它们作为环境变量传递。

Streamlit 提供了基于文件的原生密钥管理功能,可以轻松存储并安全访问您在 Streamlit 应用中的密钥。

push_pin

注意

现有的秘密管理工具,例如dotenv文件AWS凭证文件Google Cloud Secret ManagerHashicorp Vault,在Streamlit中都可以正常工作。我们只是在需要时添加了原生的秘密管理功能。

Streamlit 提供了两种使用 TOML 格式在本地设置密钥的方法:

  1. 全局密钥文件中,位于~/.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应用程序共享相同的密钥时,你不必在多个项目级文件中重复密钥。

  2. 每个项目的密钥文件中,位于$CWD/.streamlit/secrets.toml,其中$CWD是您运行Streamlit的文件夹。如果全局密钥文件和每个项目的密钥文件都存在,每个项目文件中的密钥将覆盖全局文件中定义的密钥

priority_high

重要

将此文件添加到您的.gitignore中,这样您就不会提交您的秘密!

通过查询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"], )
star

提示

你可以通过属性符号(例如 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)

以下是使用秘密管理时可能遇到的一些常见错误。

  • 如果在应用程序运行时创建了.streamlit/secrets.toml文件,则需要重新启动服务器以使更改在应用程序中生效。

  • 如果您尝试访问一个秘密,但没有secrets.toml文件存在,Streamlit 将引发一个FileNotFoundError异常:

    Secrets management FileNotFoundError
  • 如果您尝试访问一个不存在的密钥,Streamlit 将引发一个 KeyError 异常:

    import streamlit as st st.write(st.secrets["nonexistent_key"])
    Secrets management KeyError

当您将应用程序部署到Streamlit Community Cloud时,您可以使用与本地相同的秘密管理工作流程。但是,您还需要在社区云秘密管理控制台中设置您的秘密。通过云特定的秘密管理文档了解如何操作。

forum

还有问题吗?

我们的 论坛 充满了有用的信息和Streamlit专家。