streamlit_supabase_auth_ui

社区文章 发布于 2024年11月3日

适用于无缝 Streamlit 应用程序的无缝 Supabase 身份验证

Streamlit navigating the Supabase sea

目的与灵感

Streamlit 是一个流行的 Python 后端到前端应用程序开发框架,多年来已经开发出多种解决方案来解决 Streamlit 应用程序的用户身份验证和管理问题。

其中最受欢迎的是 streamlit-authenticatorstreamlit_login_auth_ui,尽管它们提供了多种高级功能和动态用户界面,但缺乏可靠的后端、以数据库为中心的用户管理(通常通过本地文件进行)。

我们决定基于 Gauri Prabhakar 的登录界面构建一个新的身份验证用户界面,它结合了 Supabase PostgreSQL 数据库的强大功能和 Streamlit 的无缝前端组件,并将其连接到 Courier 提供的电子邮件通知服务。

该用户界面具有登录、用户注册、密码重置和“忘记密码”功能,以及注销功能。

那么,让我们开始吧!🚀

第三方服务

1. Supabase

我们需要一个 Supabase 账户来构建一个项目,获取其 URL 和 ANON 密钥,并创建一个 `user_authentication` 数据库,该数据库将把我们的用户界面连接到后端、以数据库为中心的用户管理。

为此,我们:

  1. 创建一个 Supabase 账户
  2. 前往 我们的仪表板
  3. 创建一个新项目
  4. 前往 `Project Settings > API` 并复制 `Project URL` 下的 `URL` 和 `Project API Keys` 下的 `anon public` 密钥
  5. 将 URL 复制到 `.streamlit/secrets.toml` 中的 `supa_url`,将 ANON 密钥复制到 `supa_key`
  6. 在 Supabase 上打开 SQL 编辑器并执行以下命令
CREATE TABLE user_authentication (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    username VARCHAR(255) DEFAULT NULL,
    password VARCHAR(255) DEFAULT NULL,
    email VARCHAR(255) DEFAULT NULL,
    name VARCHAR(255) DEFAULT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

2. Courier

我们主要出于两个原因发送电子邮件通知:

  • 欢迎新用户注册
  • 在他们想要更改旧密码/丢失密码时发送重置密码

为此,我们使用前面提到的 Courier,因此我们需要:

  1. 注册 Courier
  2. 创建一个新工作区
  3. 启用电子邮件服务提供商。最简单和最便宜的选择是 Gmail:您只需指定您想要激活服务的 Gmail 账户,该账户也将是发送所有电子邮件的账户。
  4. 从 `Settings > API Keys` 检索授权令牌
  5. 复制授权令牌并将其放在 `.streamlit/secrets.toml` 中的 `courier_auth_token` 下

创建您的应用程序

1. 从源代码构建

现在我们想要创建我们的 Streamlit 应用程序,并带有 Supabase 身份验证和用户管理功能。为此,我们:

  1. 克隆此仓库并进入其中
git clone https://github.com/AstraBert/streamlit_supabase_auth_ui.git
cd streamlit_supabase_auth_ui
  1. 创建并激活 Python 虚拟环境
python3 -m venv streamlit-app
source streamlit-app/bin/activate
  1. 安装所有必要的依赖项
python3 -m pip install -r requirements.txt
  1. 用我们预先获取的 Supabase 项目 URL(`supa_url`)、Supabase 项目 ANON 密钥(`supa_key`)和 Courier 身份验证令牌(`courier_auth_token`)修改 `.streamlit/secrets.toml`
  2. 运行应用程序
python3 -m streamlit run app.py

您显然可以随心所欲地自定义 Streamlit 应用程序,您只需集成此部分代码即可使基于 Supabase 的身份验证正常工作

import streamlit as st
from .streamlit_supabase_auth_ui.widgets import __login__

__login__obj = __login__(auth_token = st.secrets["courier_auth_token"],
                    company_name = "YOUR-ORG-NAME",
                    width = 200, height = 250,
                    logout_button_name = 'Logout', hide_menu_bool = False,
                    hide_footer_bool = False,
                    lottie_url = 'https://assets2.lottiefiles.com/packages/lf20_jcikwtux.json')

LOGGED_IN= __login__obj.build_login_ui()

if LOGGED_IN == True:

   ### Your Streamlit app here!

2. 获取 PyPi 包

我们还将 `streamlit-supabase-auth-ui` 制成了一个可在 PyPi 上获取的 Python 包,您可以在这里找到它。

要获取它,只需运行

python3 -m pip install streamlit-supabase-auth-ui

安装过程将负责安装所有必要的依赖项✅

然后您只需在代码中导入该包即可

import streamlit as st
from streamlit_supabase_auth_ui.widgets import __login__

__login__obj = __login__(auth_token = st.secrets["courier_auth_token"],
                    company_name = "YOUR-ORG-NAME",
                    width = 200, height = 250,
                    logout_button_name = 'Logout', hide_menu_bool = False,
                    hide_footer_bool = False,
                    lottie_url = 'https://assets2.lottiefiles.com/packages/lf20_jcikwtux.json')

在线演示

HuggingFace Spaces 上找到在线演示。

社区

你好,祝贺你的工作。

是否可以自定义菜单名称和输入并翻译成其他语言?

文章作者

你好!是的,代码是开源的,您可以根据您的项目进行修改 :)
如果您想更改组件的语言,只需修改 widget.py 脚本即可,即 https://github.com/AstraBert/streamlit_supabase_auth_ui/blob/main/streamlit_supabase_auth_ui/widgets.py

·

感谢您的回答。=)

我还有一个问题,我在应用程序中收到此消息:

st.cache 已弃用,很快将被移除。请使用 Streamlit 新的缓存命令 st.cache_data 或 st.cache_resource。更多信息请参阅我们的文档。

注意:st.cache 的行为已在 Streamlit 1.36 中更新为 st.cache_data 和 st.cache_resource 使用的新缓存逻辑。这可能在某些边缘情况下导致一些问题或意外行为。

我在代码中查找了您调用 st.cache 的位置,但未能找到。请问您能帮我找到它吗?

文章作者

我没有指定任何配置,但我很确定我们可以利用 Supabase 为用户设置登录/登出状态(比如:用户上次登录时间为 X,登出时间为 Y;如果 Y > X,则用户可以再次登录,否则不能)。
如果您愿意,我可以将其添加到下一个软件包版本的开发路线图中:那么我会请您在此处提出问题:https://github.com/AstraBert/streamlit_supabase_auth_ui/issues,这样我就可以将其添加到 v0.1.0 的里程碑中 :)

太棒了,如果能更新这个库就太好了。我会去做的,我会把它发到那里。再次感谢。我正在 Streamlit 中创建一个微型 SaaS,你的这个组件对我帮助很大。

文章作者

大家好,我只想在这里也说一下,这样看到我们对话的人就知道这个功能已经集成:您现在可以在软件包的 v0.1.0 版本中找到它,已经可以通过 pip 安装。
玩得开心!

感谢这个,它让我的一天过得很好

注册登录 发表评论