一个简洁高效的Flask用户管理示例
Flask-Login 是 Flask 的用户管理扩展,提供 用户身份验证、会话管理、权限控制 等功能。
适用于:
• 用户登录、登出
• 记住用户(“记住我” 功能)
• 限制未登录用户访问某些页面
• 用户会话管理
1. 安装 Flask-Login
pip install flask-login flask-sqlalchemy
main.py
from flask import Flask, render_template, redirect, url_for, request, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_userapp = Flask(__name__)# 配置 Flask 和数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 使用 SQLite 数据库
app.config['SECRET_KEY'] = 'your_secret_key' # Flask-Login 需要 secret key
db = SQLAlchemy(app)
login_manager = LoginManager(app)# 定义用户模型
class User(UserMixin, db.Model): # UserMixin 提供 Flask-Login 必需的方法id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(100), unique=True, nullable=False)password = db.Column(db.String(200), nullable=False) # 真实应用需加密密码# 创建数据库表(仅需运行一次)
with app.app_context():db.create_all()# Flask-Login 加载用户的回调函数
@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id)) # 通过 ID 获取用户@app.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')if not username or not password:flash("用户名和密码不能为空!")return redirect(url_for('register'))# 检查用户是否已存在existing_user = User.query.filter_by(username=username).first()if existing_user:flash("用户名已存在,请选择其他用户名")return redirect(url_for('register'))# 创建新用户并保存到数据库new_user = User(username=username, password=password) # 这里应加密密码db.session.add(new_user)db.session.commit()flash("注册成功,请登录!")return redirect(url_for('login'))return render_template('register.html')@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')# 查找用户user = User.query.filter_by(username=username).first()if user and user.password == password: # 这里应使用加密密码验证login_user(user) # 登录用户flash("登录成功!")return redirect(url_for('dashboard'))flash("用户名或密码错误")return redirect(url_for('login'))return render_template('login.html')@app.route('/dashboard')
@login_required # 保护此路由,未登录用户无法访问
def dashboard():return f"欢迎 {current_user.username}!这是您的仪表盘。 <a href='/logout'>登出</a>"@app.route('/logout')
@login_required
def logout():logout_user()flash("您已成功退出!")return redirect(url_for('login'))if __name__ == "__main__":app.run(debug=True)
templates/login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form method="post"><label>用户名:</label><input type="text" name="username" required><label>密码:</label><input type="password" name="password" required><button type="submit">登录</button>
</form>
</body>
</html>
templates/register.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form method="post"><label>用户名:</label><input type="text" name="username" required><label>密码:</label><input type="password" name="password" required><button type="submit">注册</button></form>
</body>
</html>
运行,然后访问:
• 注册:http://127.0.0.1:5000/register
• 登录:http://127.0.0.1:5000/login
• 仪表盘(必须登录):http://127.0.0.1:5000/dashboard
• 登出:http://127.0.0.1:5000/logout
相关文章:
一个简洁高效的Flask用户管理示例
Flask-Login 是 Flask 的用户管理扩展,提供 用户身份验证、会话管理、权限控制 等功能。 适用于: • 用户登录、登出 • 记住用户(“记住我” 功能) • 限制未登录用户访问某些页面 • 用户会话管理 1. 安装 Flask-Login pi…...
分布式之分布式ID
目录 需求 1. 全局唯一性 2. 高性能 3. 高可用性 4. 可扩展性 5. 有序性 6. 时间相关 7. 长度适中 8. 安全性 9. 分布式一致性 10. 易于集成 常见解决方案 选择依据 数据库号段模式 核心概念 工作流程 优点 缺点 实现示例 优化策略 适用场景 Snowflake雪…...
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
目录 前言与导论 碎碎念 所以,我到底需要知道哪些东西呢 从一些基础的概念入手 常见的工具和说法 ST公司 MDK5 (Keil5) CubeMX 如何使用MDK5的一些常用功能 MDK5的一些常见的设置 前言与导论 非常感谢2301_77816627-CSDN博客的提问,他非常好奇…...
边缘计算网关与 PLC:注塑机车间数据互联新变革
在当今数字化浪潮席卷而来的时代,制造业的智能化转型成为了提升竞争力的关键路径。对于注塑机车间而言,如何实现数据的高效采集与互联,进而优化生产流程、提高生产效率,是众多企业亟待解决的问题。而明达MBox20边缘计算网关与 PLC…...
LeetCode刷题---哈希表---347
前 K 个高频元素 347. 前 K 个高频元素 - 力扣(LeetCode) 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1…...
LED灯闪烁实验:实验介绍
文章目录 1 实验目标2 工具链2.1 硬件2.2 软件 3 实验流程 1 实验目标 本实验结合Matlab/Simulink工具链和STM工具链,实现STM32开发板上的LED灯闪烁功能。 2 工具链 2.1 硬件 STM32F103C8T6最小系统板 STM32F103C8T6最小系统板是基于STM32F103C8T6微控制器的开发…...
论文笔记(七十二)Reward Centering(一)
Reward Centering(一) 文章概括摘要1 奖励中心化理论 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…...
C#之上位机开发---------C#通信库及WPF的简单实践
〇、上位机,分层架构 界面层 要实现的功能: 展示数据 获取数据 发送数据 数据层 要实现的功能: 转换数据 打包数据 存取数据 通信层 要实现的功能: 打开连接 关闭连接 读取数据 写入数据 实体类 作用: 封装数据…...
使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频
如何使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频 声明 该播客仅提供实现思路,并非实际的方案记录,不要盲目照搬。 pjsua2库的安装会有较多问题,请参考本人之前的播客进行安装 pjsua2。 pjsua2 库具体的 api 说明请参考开源库内的 范例代码。 引言 在今天的…...
从函数到神经网络
所有一切的前提是,你要相信这个世界上的所有逻辑和知识,都可以用一个函数来表示。Functions describe the world ! 比如输入物体的质量和加速度,根据牛顿第二定律,就可以得到物体施加的力,这就是人工智能早期的思路&am…...
用自定义注解实现Excel数据导入中的枚举值校验
使用自定义注解实现Excel数据导入中的枚举值校验 在实际开发中,我们经常需要从Excel文件中导入数据,并且这些数据需要符合一定的规则,比如某些字段的值必须是预定义的枚举值。本文将介绍如何使用自定义注解来实现这一功能,以提高…...
网络安全技术pat实验 网络安全 实验
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 网络安全实验3 前言Kali 常用指令工具教程 ettercap 基本使用 一、口令破解 John the ripper 破解 linux 密码l0phtcrack7 破解 windows 密码John 破解 zip 压…...
4、IP查找工具-Angry IP Scanner
在前序文章中,提到了多种IP查找方法,可能回存在不同场景需要使用不同的查找命令,有些不容易记忆,本文将介绍一个比较优秀的IP查找工具,可以应用在连接树莓派或查找IP的其他场景中。供大家参考。 Angry IP Scanner下载…...
1018. 锤子剪刀布 (20)-PAT乙级真题
题目来源: PTA | 程序设计类实验辅助教学平台 代码实现(代码一): 这个版本是自己写的;(很好理解,但定义了很多变量),有部分样例测试不通过 #include <iostream>…...
MyBatis 中 SqlMapConfig 配置文件详解
精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 configuration:包裹所有配置标签,是整个配置文件的顶级标签。 properties:属性,该标签可以引入外部配置的属性ÿ…...
复杂项目中的多级WBS应该如何分解?
如果你曾经参与过一个复杂的项目,或许就会感受到: 任务繁杂、责任不清、进度难追踪, 真的是每一位项目经理的噩梦。 而这一切的根源,往往就是缺少一个清晰、有效的任务分解结构—— 没有把庞大、复杂的工作拆解得足够明确&…...
红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测
文章目录 研判(入侵检测) 设备 经典网络云网络 异常HTTP请求Webshell分析 Webshell 的分类Webshell 的检测 主机层面流量层面 附录 常见端口漏洞…...
使用 CodeMirror 6 实现插入文本及替换选中文本功能
本文将通过具体的代码示例,详细解释如何在 Vue3 中使用 CodeMirror 6 实现文本插入功能,包括在光标位置插入文本和选中文本插入文本的代码示例,以及这两种插入方式的区别。 1. 只能在光标位置插入文本 1.1 代码示例 const insertTemplate …...
Huatuo热更新--如何使用
在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main(可自定义),然后按下图创建文件,注意名称与文件夹名称保持一致 然后新建场景(Init场景),添加3个空物体…...
Flask实现高效日志记录模块
目录 一. 简介: 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建(包含日志记录的关键字段) 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…...
Bilibili评论数据采集实战:从爬虫工具到数据分析的完整解决方案
Bilibili评论数据采集实战:从爬虫工具到数据分析的完整解决方案 【免费下载链接】BilibiliCommentScraper B站视频评论爬虫 Bilibili完整爬取评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间、点赞数 项目地址: https://gitcode.com/gh_mirr…...
小林大模型|大模型面试高频知识点合集2
什么是 Agent?与大模型有什么本质不同? 面试时答这道题,一定要点出三件事:一是 Agent 有自主规划能力,给它一个复杂目标它能自己拆解成多步;二是它能行动,通过工具调用跟外部世界真实交互&…...
终极指南:3步掌握LSPatch免Root模块注入框架
终极指南:3步掌握LSPatch免Root模块注入框架 【免费下载链接】LSPatch LSPatch: A non-root Xposed framework extending from LSPosed 项目地址: https://gitcode.com/gh_mirrors/ls/LSPatch 在Android生态系统中,LSPatch作为一款创新的免Root X…...
Java 25虚拟线程调度突然卡顿?5步精准诊断法(含jcmd+AsyncProfiler+VirtualThreadMonitor三工具联动脚本)
更多请点击: https://intelliparadigm.com 第一章:Java 25虚拟线程资源调度优化 Java 25 引入了对虚拟线程(Virtual Threads)调度器的深度重构,核心在于将平台线程(Platform Thread)与虚拟线程…...
19.【AI权限与成本控制系统实战】一次API被刷爆让我损失上千元:如何设计企业级权限+配额系统?(完整落地方案)
【AI权限与成本控制系统实战】一次API被刷爆让我损失上千元:如何设计企业级权限配额系统?(完整落地方案)一、问题场景(真实事故复盘) 这是我做AI系统以来,最“肉疼”的一次事故。 某天凌晨&…...
PP-YOLOE的‘轻量’与‘巨无霸’:如何为你的项目选对s/m/l/x模型?
PP-YOLOE模型选型实战指南:从参数对比到落地优化 当你面对 Jetson Nano 上 2GB 内存的苛刻环境,或是需要处理 4K 视频流的生产服务器时,模型选型就成了生死攸关的技术决策。PP-YOLOE 提供的 s/m/l/x 四个版本不是简单的尺寸变化,而…...
基于Monaco Editor的内联差异编辑器:实现代码审查的接受、拒绝与撤销功能
1. 项目概述:一个能“原地”接受、拒绝和撤销的代码差异编辑器 如果你经常需要审查代码,或者处理不同版本的文本合并,那你一定对传统的“并排对比”视图感到过一丝疲惫。左边是旧版本,右边是新版本,眼睛来回扫视&#…...
从计算sin(π/6)开始:手把手教你用STM32的DSP库做实际信号处理
从计算sin(π/6)到实时频谱分析:STM32 DSP库实战指南 在嵌入式开发中,信号处理一直是提升系统性能的关键环节。想象一下,你正在设计一个智能家居的声控模块,需要快速识别用户的语音指令;或者开发一款工业设备的状态监测…...
终极指南:如何用HMCL启动器轻松管理你的Minecraft游戏世界
终极指南:如何用HMCL启动器轻松管理你的Minecraft游戏世界 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Launc…...
告别‘震耳欲聋’:5分钟搞定RK3568开发板的系统音量默认值(修改设备树参数)
RK3568开发板音量优化实战:5分钟修改设备树解决默认音量问题 第一次在RK3568开发板上用aplay播放音频时,突如其来的巨大音量差点让我把耳机扔出去——这恐怕是许多开发者共同的"惊悚体验"。不同于传统PC或手机,嵌入式设备的音频系统…...
