Streamlit 实现登录注册验证
在开发基于 Streamlit 的应用时,用户认证功能是一个常见需求。本文将介绍如何通过两种方式来实现登录注册功能:手动实现 和 使用 Streamlit-Authenticator 库。手动实现虽然灵活,但需要自行处理密码加密、验证等细节;而 Streamlit-Authenticator 库则大大简化了这些操作,让我们能够快速搭建一个完整的用户认证系统。
一、手动实现登录注册
我们首先通过手动方式实现登录和注册功能。这种方式适用于你需要对认证流程有更多控制的场景。
1. 环境准备
在开始之前,需要确保安装了 streamlit 和 bcrypt 库,用于处理用户界面和密码加密。
pip install streamlit bcrypt
2. 注册功能
在注册功能中,用户输入用户名和密码。密码将通过 bcrypt 进行加密存储,以提高安全性。
import streamlit as st
import bcrypt# 模拟的用户数据库
users_db = {}# 注册页面
def register():st.title("用户注册")# 输入用户名和密码new_user = st.text_input("请输入用户名")new_password = st.text_input("请输入密码", type="password")if st.button("注册"):if new_user in users_db:st.warning("用户名已存在,请选择其他用户名")else:# 对密码进行加密hashed_password = bcrypt.hashpw(new_password.encode('utf-8'), bcrypt.gensalt())users_db[new_user] = hashed_passwordst.success("注册成功!")st.info("请返回登录页面")if __name__ == '__main__':register()
在这个示例中,用户的密码会被 bcrypt 加密后存储,保证其安全性。每次用户注册时,都会生成一个新的加密密码,并存入 users_db。
3. 登录功能
接下来是登录功能。用户输入用户名和密码后,系统会验证其输入的密码是否与存储的加密密码匹配。
# 登录页面
def login():st.title("用户登录")# 输入用户名和密码username = st.text_input("请输入用户名")password = st.text_input("请输入密码", type="password")if st.button("登录"):if username in users_db:# 验证密码是否匹配hashed_password = users_db[username]if bcrypt.checkpw(password.encode('utf-8'), hashed_password):st.success(f"欢迎回来,{username}!")st.info("你已成功登录")main_page()else:st.error("密码错误,请重试")else:st.warning("用户名不存在")# 登录成功后的主页面
def main_page():st.title("主页面")st.write("这是登录后的主页面内容")if __name__ == '__main__':login()
这里通过 bcrypt.checkpw() 函数验证用户输入的密码是否与数据库中的加密密码匹配。如果密码验证成功,用户会进入主页面。
4. 页面导航
为了方便用户在登录和注册页面之间切换,可以通过以下代码实现简单的页面导航功能。
def main():st.sidebar.title("导航")choice = st.sidebar.radio("选择页面", ["登录", "注册"])if choice == "登录":login()elif choice == "注册":register()if __name__ == '__main__':main()
这个页面导航让用户可以在侧边栏自由切换登录和注册功能,从而提升用户体验。
5. 小结
通过以上代码,我们实现了一个基本的用户登录注册系统,包括:
- 注册功能:加密存储用户密码,防止明文密码泄露。
- 登录功能:验证用户输入的密码是否与存储的加密密码匹配。
- 页面导航:让用户可以在不同功能页面间切换。
这种手动实现方式适合需要灵活控制认证流程的场景,但当项目规模较大或需求更加复杂时,这种方式可能会显得繁琐。接下来,我们介绍如何使用 Streamlit-Authenticator 库来简化这一过程。
二、使用 Streamlit-Authenticator 实现登录注册
Streamlit-Authenticator 是一个专门用于 Streamlit 应用的用户认证库,它能够帮助我们快速构建基于哈希加密和JWT令牌的认证系统。使用该库,我们可以省去手动实现登录、注册、加密等繁琐的过程。
1. 安装 Streamlit-Authenticator
首先,安装 streamlit-authenticator 库:
pip install streamlit-authenticator
2. 使用 Streamlit-Authenticator 实现认证
以下是使用 streamlit-authenticator 库实现用户登录的代码示例:
import streamlit as st
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoader# 加载用户数据
config = {'credentials': {'usernames': {'user1': {'name': 'User One','password': stauth.Hasher(['password1']).generate()[0]},'user2': {'name': 'User Two','password': stauth.Hasher(['password2']).generate()[0]}}},'cookie': {'expiry_days': 30,'key': 'some_signature_key'},'preauthorized': {'emails': ['user1@example.com','user2@example.com']}
}# 创建 Authenticator 对象
authenticator = stauth.Authenticate(config['credentials'],config['cookie']['key'],config['cookie']['expiry_days'],
)# 登录功能
name, authentication_status, username = authenticator.login('登录', 'main')if authentication_status:st.success(f'欢迎回来, {name}!')# 退出登录按钮authenticator.logout('退出', 'sidebar')st.write("这里是登录后显示的内容")
elif authentication_status == False:st.error('用户名或密码错误')
elif authentication_status == None:st.warning('请输入用户名和密码')
3. 代码解析
- 用户数据配置:
config字典模拟用户数据库,stauth.Hasher用于生成加密密码。 - 登录功能:
authenticator.login()用于处理登录验证,根据返回值authentication_status判断用户登录状态。 - Cookie:配置项中的
cookie设置了 JWT 的有效期,并使用一个密钥来确保用户登录状态的持久性。 - 登出功能:用户成功登录后可以通过侧边栏中的按钮退出登录。
通过 Streamlit-Authenticator,我们大大简化了用户登录、认证和密码加密的过程。
4. 小结
Streamlit-Authenticator 提供了开箱即用的用户认证功能,尤其适用于需要快速搭建用户管理系统的场景。相比手动实现,它的优点包括:
- 内置的密码加密机制。
- 支持长时间登录的 JWT 机制。
- 更加安全、便捷的用户认证体验。
三、总结
本文展示了两种实现 Streamlit 用户认证的方式:
- 手动实现:我们通过
bcrypt加密用户密码,自己实现了登录、注册和认证的基本功能。这种方式适合需要灵活处理认证逻辑的场景。 - 使用 Streamlit-Authenticator:该库简化了整个认证流程,提供了更安全和方便的解决方案,适合需要快速构建用户系统的场景。
根据你的需求,可以选择适合的实现方式。对于更复杂或更大规模的应用,Streamlit-Authenticator 无疑是更好的选择。
相关文章:
Streamlit 实现登录注册验证
在开发基于 Streamlit 的应用时,用户认证功能是一个常见需求。本文将介绍如何通过两种方式来实现登录注册功能:手动实现 和 使用 Streamlit-Authenticator 库。手动实现虽然灵活,但需要自行处理密码加密、验证等细节;而 Streamlit…...
ASP.NET Zero 多租户介绍
ASP.NET Zero 是一个基于 ASP.NET Core 的应用程序框架,它提供了多租户支持,以下是关于 ASP.NET Zero 多租户的介绍: 一、多租户概念 多租户是一种软件架构模式,允许多个客户(租户)共享同一套软件应用程序…...
【60天备战2024年11月软考高级系统架构设计师——第29天:微服务架构——微服务的优缺点】
微服务架构通过将大型单体应用拆分为多个独立的小型服务,使系统具备灵活性、可扩展性和独立部署的优势。但与此相伴的是复杂的运维和开发管理挑战。因此,在选择微服务架构时,架构师需仔细权衡其优势与劣势。 微服务架构的优点 独立部署&…...
读论文、学习时 零碎知识点记录01
1.入侵检测技术 2.深度学习、机器学习相关的概念 ❶注意力机制 ❷池化 ❸全连接层 ❹Dropout层 ❺全局平均池化 3.神经网络中常见的层...
图解C#高级教程(一):委托
什么是委托 可以认为委托是持有一个或多个方法的对象。但它与对象不同,因为委托可以被执行。当执行委托时,委托会执行它所“持有”的方法。先看一个完整的使用示例。 // See https://aka.ms/new-console-template for more informationdelegate void M…...
CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2024-09-28)
【前言】 本期视频就一个任务,通过ARM官方的CMSIS RTOS文档,将常用配置和用法给大家梳理清楚。 对于初次使用CMSIS-RTOS的用户来说,通过梳理官方文档,可以系统的了解各种用法,方便大家再进一步的自学或者应用&#x…...
渗透测试入门学习——使用python脚本自动识别图片验证码,OCR技术初体验
写在前面 由于验证码在服务端生成后存储在服务器的session中,而标用于标识用户身份的sessionid存在于用户cookie中 所以本次识别验证码时需要用requests.session()创建会话对象,模拟真实的浏览器行为,保持与服务器的会话才能获取登录时服务…...
docker环境下配置cerbot获取免费ssl证书并自动续期
文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器,通过容器卷,实现本地html,ssl,conf和ngiinx容器映射的, 经常需要手动部署…...
Studying-多线程学习Part1-线程库的基本使用、线程函数中的数据未定义错误、互斥量解决多线程数据共享问题
来源:多线程编程 线程库的基本使用 两个概念: 进程是运行中的程序线程是进程中的进程 串行运行:一次只能取得一个任务并执行这一个任务 并行运行:可以同时通过多进程/多线程的方式取得多个任务,并以多进程或多线程…...
Flink 03 | 数据流基本操作
Flink数据流结构 DataStream 转换 通常我们需要分析的业务数据可能存在如下问题: 数据中包含一些我们不需要的数据 数据格式不方面分析 因此我们需要对原始数据流进行加工,比如过滤、转换等操作才可以进行数据分析。 “ Flink DataStream 转换主要作…...
在 TS 的 class 中,如何防止外部实例化
在 TypeScript(TS)中,如果你想要防止一个类被外部实例化,你可以采取以下几种策略: 将构造函数设为私有(Private Constructor): 通过将类的构造函数设为私有,你可以阻止外…...
HTML详解
HTML 基础HTML 标题HTML 段落HTML 链接HTML 图片HTML 元素HTML 注释HTML 属性HTML 文本格式化HTML 头部HTML cssHTML 表格HTML 列表HTML 自定义列表HTML 区块HTML 表单HTML 框架HTML 颜色HTML 脚本HTML 事件HTML 实体HTML urlHTML5 新元素 新元素 新元素 新元素 新元素 新元素 …...
记录|Modbus-TCP产品使用记录【德克威尔】
目录 前言一、德克威尔1.1 实验图1.2 DECOWELL IO Tester 软件1.3 读写设置1.4 C#进行Modbus-TCP读写 更新时间 前言 参考文章: 使用的第二款Modbus-TCP产品。 一、德克威尔 1.1 实验图 1.2 DECOWELL IO Tester 软件 这也是自带模块配置软件的。下图就是德克威尔的…...
基于深度学习的视频生成
基于深度学习的视频生成是一项极具前景的技术,旨在通过神经网络模型生成逼真的动态视频内容。随着生成对抗网络(GANs)、自回归模型、变分自编码器(VAEs)等深度学习模型的发展,视频生成技术已经取得了显著进…...
TB6612电机驱动模块(STM32)
目录 一、介绍 二、模块原理 1.原理图 2.电机驱动原理 三、程序设计 main.c文件 Motor.h文件 Motor.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流 MOSFET-H 桥结构ÿ…...
webpack信息泄露
先看看webpack中文网给出的解释 webpack 是一个模块打包器。它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换、打包或包裹任何资源。 如果未正确配置,会生成一个.map文件,它包含了原始JavaScript代码的映…...
启动服务并登录MySQL9数据库
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) Windows平台下安装与配置MyS…...
微服务_3.微服务保护
文章目录 一、微服务雪崩及解决方法1.1、超时处理1.2、仓壁模式1.3、断路器1.4、限流 二、Sentinel2.1、流量控制2.1.1、普通限流2.1.2、热点参数限流 2.2、线程隔离2.3、熔断降级2.3.1、断路器状态机2.3.2、断路器熔断策略2.3.2.1、慢调用2.3.2.2、异常比例,异常数…...
【设计模式】软件设计原则——依赖倒置合成复用
依赖倒置引出 依赖倒置 定义:高层模块不应该依赖低层模块,二者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。面向接口编程而不是面向实现编程。 通过抽象使用抽象类、接口让各个类or模块之间独立不影响,实现…...
vue中如何实现组件通信
1. 父子组件通信 1. props和emits 我们最常见的组件通信就是父子组件数据通信。父子组件实现数据通信需要使用props和emit两个api。 在父组件中我们通过props将数据绑定给子组件,在子组件中我们可以通过props对象来收集到父组件传递的数据。 在子组件想要修改的pr…...
Tendis与Redis Cluster对比分析:性能、成本与适用场景深度评测
Tendis与Redis Cluster对比分析:性能、成本与适用场景深度评测 【免费下载链接】Tendis Tendis is a high-performance distributed storage system fully compatible with the Redis protocol. 项目地址: https://gitcode.com/gh_mirrors/te/Tendis 在当今…...
函数信号发生器电路仿真、原理图及PCB设计
函数信号发生器电路仿真,原理图,PCB拆开手头的旧音响翻出几颗运放,突然想搞个函数信号发生器玩玩。这玩意儿说难不难,关键得让方波、三角波、正弦波乖乖听话。咱们今天直接从电路仿真干起,免得焊板子时炸电容。先上LTs…...
GSE-Advanced-Macro-Compiler:重新定义魔兽世界技能自动化的开发实践
GSE-Advanced-Macro-Compiler:重新定义魔兽世界技能自动化的开发实践 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. It uses Travis for UnitTests, Coveralls to report on test …...
基于编码器-解码器神经网络的阵列综合技术复现与研究
基于编码器-解码器神经网络的阵列综合技术复现与研究 摘要 本报告旨在复现利用深度学习解决天线阵列综合问题的实验案例。传统的阵列综合方法(如Woodward-Lawson法、迭代傅里叶变换法)在面对非均匀阵列或复杂波束形状时,往往存在计算量大、依赖初始值等问题。本文构建了一…...
PvZ Toolkit:突破植物大战僵尸限制的终极修改器
PvZ Toolkit:突破植物大战僵尸限制的终极修改器 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 副标题:面向全阶段玩家的游戏体验增强工具,让每一场攻防战尽在掌…...
流程越来越规范,但员工体验却越来越差
在很多企业推进 IT 管理规范化的过程中,流程建设往往是重点。 审批流程更加清晰,操作步骤更加标准,所有请求都可以通过系统统一管理。从管理角度来看,这是明显的进步。 流程可控、操作可追溯、风险也更容易管理。但从员工的实际体…...
【系统分析师_知识点整理】 8.项目管理
核心考向:进度管理(计算 选择最高频):关键路径、ES/EF/LS/LF、总浮动时间、自由浮动时间、PDM 四种依赖、进度偏差分析;范围管理:WBS、范围确认、范围控制、范围边界定义;成本管理:…...
SolidWorks 与 CATIA 模型转换实战:从本地操作到云端解决方案
1. 为什么需要SolidWorks与CATIA模型转换 在机械设计领域,SolidWorks和CATIA就像两个说着不同语言的工程师。SolidWorks以其直观的操作界面和强大的参数化建模能力,成为中小企业和教育机构的首选工具。而CATIA则凭借在复杂曲面设计和高端制造领域的深厚积…...
LabelImg图像标注工具:3分钟掌握高效目标检测数据标注技巧
LabelImg图像标注工具:3分钟掌握高效目标检测数据标注技巧 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check ou…...
别再为Allegro导图发愁了!手把手教你用RATA工具搞定BMP单色图转换(附像素调整避坑指南)
Allegro图片导入难题终极指南:从原理到实战的完整解决方案 在PCB设计领域,Allegro作为行业标杆工具,却有一个让无数工程师头疼的"阿喀琉斯之踵"——图片导入功能。无论是公司Logo、结构示意图还是特殊标识,当我们需要将…...
