Connect Streamlit to a private Google Sheet

本指南解释了如何从Streamlit社区云安全地访问私有的Google Sheet。它使用了st.connectionStreamlit GSheetsConnection和Streamlit的Secrets management

如果您不介意为您的Google表格启用链接共享(即任何拥有链接的人都可以查看它),指南Connect Streamlit to a public Google Sheet展示了一种更简单的方法。如果您的表格包含敏感信息且您无法启用链接共享,请继续阅读。

本教程要求您的Python环境中安装有streamlit>=1.28st-gsheets-connection

如果您已经有一个想要使用的Sheet,您可以跳到下一步

使用此示例数据创建一个电子表格。

名字宠物
玛丽
约翰
罗伯特
Google sheet screenshot

通过Google Cloud Platform控制对Google Sheets的编程访问。创建账户或登录并前往APIs & Services dashboard(如果需要,选择或创建一个项目)。如下所示,搜索Sheets API并启用它:

GCP screenshot 1
GCP screenshot 2
GCP screenshot 3

要从Streamlit社区云使用Sheets API,您需要一个Google云平台服务账户(一种用于程序化数据访问的特殊账户类型)。前往服务账户页面并创建一个具有查看者权限的账户(这将允许账户访问数据但不能更改数据):

GCP screenshot 5
GCP screenshot 6
GCP screenshot 7
push_pin

注意

按钮“CREATE SERVICE ACCOUNT”是灰色的,您没有正确的权限。请向您的Google Cloud项目的管理员寻求帮助。

点击“DONE”后,您应该会返回到服务账户概览页面。首先,记下您刚刚创建的账户的电子邮件地址(下一步很重要!)。然后,为新账户创建一个JSON密钥文件并下载它:

GCP screenshot 8
GCP screenshot 9
GCP screenshot 10

默认情况下,您刚刚创建的服务账户无法访问您的Google表格。要授予其访问权限,请点击Google表格中的“共享”按钮,添加服务账户的电子邮件(在步骤2中记下的),并选择正确的权限(如果您只想读取数据,“查看者”就足够了):

GCP screenshot 11
GCP screenshot 12

您的本地 Streamlit 应用程序将从应用程序根目录中的文件 .streamlit/secrets.toml 读取密钥。如果此文件尚不存在,请创建此文件,并添加您的 Google Sheet 的 URL 以及您下载的密钥文件的内容,如下所示:

# .streamlit/secrets.toml [connections.gsheets] spreadsheet = "https://docs.google.com/spreadsheets/d/xxxxxxx/edit#gid=0" # From your JSON key file type = "service_account" project_id = "xxx" private_key_id = "xxx" private_key = "xxx" client_email = "xxx" client_id = "xxx" auth_uri = "https://accounts.google.com/o/oauth2/auth" token_uri = "https://oauth2.googleapis.com/token" auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs" client_x509_cert_url = "xxx"
priority_high

重要

将此文件添加到.gitignore中,不要将其提交到你的GitHub仓库!

将下面的代码复制到您的Streamlit应用程序中并运行它。

# streamlit_app.py import streamlit as st from streamlit_gsheets import GSheetsConnection # Create a connection object. conn = st.connection("gsheets", type=GSheetsConnection) df = conn.read() # Print results. for row in df.itertuples(): st.write(f"{row.name} has a :{row.pet}:")

看到上面的st.connection了吗?它处理密钥检索、设置、查询缓存和重试。默认情况下,.read()的结果会被缓存且不会过期。你可以传递可选参数给.read()来自定义你的连接。例如,你可以指定工作表的名称、缓存过期时间,或者像这样传递pandas.read_csv的参数:

df = conn.read( worksheet="Sheet1", ttl="10m", usecols=[0, 1], nrows=3, )

在这种情况下,我们设置ttl="10m"以确保查询结果缓存不超过10分钟。你也可以设置ttl=0来禁用缓存。了解更多信息,请访问Caching。我们已经声明了可选参数usecols=[0,1]nrows=3pandas在内部使用。

如果一切顺利(并且你使用了我们上面创建的示例表),你的应用程序应该看起来像这样:

Finished app screenshot

本教程假设使用本地Streamlit应用程序,但您也可以从社区云托管的应用程序连接到Google Sheets。主要附加步骤如下:

forum

还有问题吗?

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