当前位置: 首页 > article >正文

python web 开发-Flask-Login使用详解

Flask-Login使用详解:轻松实现Flask用户认证

1. Flask-Login简介

Flask-Login是Flask框架的一个扩展,专门用于处理用户认证相关的功能。它提供了用户会话管理、登录/注销视图、记住我功能等常见认证需求,让开发者能够快速实现安全的用户认证系统而无需从头开始编写。

在这里插入图片描述

2. 安装与基础配置

2.1 安装Flask-Login

pip install flask-login

2.2 基础配置

from flask import Flask
from flask_login import LoginManagerapp = Flask(__name__)
app.secret_key = 'your-secret-key-here'  # 必须设置密钥login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'  # 指定登录视图

解释

  • secret_key用于加密会话数据,生产环境应该使用随机生成的强密钥
  • login_view指定未登录用户重定向的登录页面路由

3. 用户模型要求

Flask-Login要求用户模型实现以下几个属性和方法:

from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hashclass User(UserMixin):def __init__(self, id, username, password):self.id = idself.username = usernameself.password_hash = generate_password_hash(password)def verify_password(self, password):return check_password_hash(self.password_hash, password)# UserMixin已经提供了以下方法的默认实现:# is_authenticated, is_active, is_anonymous, get_id

解释

  • UserMixin提供了Flask-Login需要的默认方法实现
  • id字段是必须的,作为用户的唯一标识
  • generate_password_hashcheck_password_hash用于安全地存储和验证密码
  • 实际项目中,用户类通常会继承自数据库模型

4. 用户加载器

@login_manager.user_loader
def load_user(user_id):# 这里应该从数据库加载用户# 示例使用一个简单的字典模拟数据库users = {'1': User('1', 'admin', 'secret'),'2': User('2', 'user', 'password')}return users.get(user_id)

解释

  • @login_manager.user_loader装饰器注册用户加载函数
  • 该函数接收用户ID字符串,返回对应的用户对象
  • 在生产环境中,这里应该查询数据库获取用户信息

5. 登录与注销功能

5.1 登录视图

from flask import render_template, redirect, url_for, request, flash
from flask_login import login_user@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']remember = request.form.get('remember', False)# 实际项目中应该查询数据库user = next((u for u in users.values() if u.username == username), None)if user and user.verify_password(password):login_user(user, remember=remember)flash('登录成功!', 'success')return redirect(url_for('dashboard'))flash('用户名或密码错误', 'danger')return render_template('login.html')

解释

  • login_user()函数建立用户会话
  • remember参数决定是否使用持久cookie(记住我功能)
  • 验证成功后重定向到受保护页面

5.2 注销视图

from flask_login import logout_user, current_user, login_required@app.route('/logout')
@login_required
def logout():logout_user()flash('您已成功注销', 'info')return redirect(url_for('login'))

解释

  • logout_user()清除用户会话
  • @login_required确保只有登录用户能访问
  • current_user代理可以访问当前用户对象

6. 保护视图与访问控制

6.1 基本视图保护

@app.route('/dashboard')
@login_required
def dashboard():return f"欢迎, {current_user.username}!"

解释

  • @login_required装饰器限制只有登录用户能访问
  • 未登录用户会被重定向到login_manager.login_view指定的页面

6.2 基于角色的访问控制

from functools import wrapsdef admin_required(f):@wraps(f)def decorated_function(*args, **kwargs):if not current_user.is_authenticated or current_user.username != 'admin':return "无权访问", 403return f(*args, **kwargs)return decorated_function@app.route('/admin')
@admin_required
def admin_panel():return "管理员面板"

解释

  • 自定义装饰器实现更细粒度的访问控制
  • 检查current_user的属性决定是否允许访问
  • 实际项目中角色信息通常存储在数据库中

7. 记住我功能

Flask-Login的记住我功能默认已经启用,由login_user()remember参数控制:

# 在登录视图中
login_user(user, remember=True)  # 启用记住我

解释

  • 启用后会在浏览器设置持久cookie
  • 即使关闭浏览器,用户仍然保持登录状态
  • 默认cookie有效期1年,可通过REMEMBER_COOKIE_DURATION配置

8. 自定义未授权处理

@login_manager.unauthorized_handler
def unauthorized():# 自定义未授权访问的处理逻辑if request.accept_mimetypes.accept_json:return jsonify(error="未授权"), 401return redirect(url_for('login', next=request.url))

解释

  • 可以针对不同请求类型返回不同响应
  • 对于API可能返回JSON,对于网页重定向到登录
  • next参数记录原始请求URL,登录后可跳转回去

9. 用户会话保护

Flask-Login提供三种会话保护级别:

login_manager.session_protection = "strong"  # 可选: None, "basic", "strong"

解释

  • None: 禁用会话保护
  • basic: 基本保护(默认),记录用户代理和IP
  • strong: 每次登录生成新会话ID,防止会话固定攻击

10. 总结

Flask-Login作为Flask的认证扩展,提供了以下核心功能:

  1. 简洁的用户模型接口:通过UserMixin快速实现所需方法
  2. 完整的会话管理:处理登录、注销和会话持久化
  3. 视图保护:通过装饰器轻松限制访问
  4. 安全特性:包括密码哈希、会话保护和CSRF防御
  5. 灵活性:可以轻松集成到任何用户存储系统

实际项目中使用Flask-Login时,建议:

  • 始终使用HTTPS保护认证数据
  • 定期更新依赖库以获取安全修复
  • 对于复杂需求,考虑结合Flask-Principal等扩展
  • 在生产环境中使用强密码哈希算法(如bcrypt)

通过合理配置,Flask-Login能够满足从简单到相对复杂的认证需求,是Flask开发生态中不可或缺的组件之一。

相关文章:

python web 开发-Flask-Login使用详解

Flask-Login使用详解:轻松实现Flask用户认证 1. Flask-Login简介 Flask-Login是Flask框架的一个扩展,专门用于处理用户认证相关的功能。它提供了用户会话管理、登录/注销视图、记住我功能等常见认证需求,让开发者能够快速实现安全的用户认证…...

快速排序算法的C++和C语言对比

快速排序算法简介: 快速排序(Quick Sort)是一种高效的排序算法,采用分治法策略。它的基本思想是: 1. 从数列中挑出一个元素作为"基准" 2. 重新排序数列,所有比基准值小的元素放在基准前面,所有比基准值大的…...

分布式事务知识点整理

目录 分布式事务问题?问题场景引入分布式事务的理论标准BASE理论附CAP理论 Two-phase Commit,2PC2PC系统组件两阶段执行过程2PC缺点 Three-Phase Commit,3PC三阶段执行过程 TTC(Try-Confirm-Cancel)seata项目以及原理how to define a Distrib…...

微信小程序数据接收

1.微信小程序蓝牙模块中的 wx.onBLECharacteristicValueChange 回调函数有时候一个数据包会分多个数据包回调,有时候多个数据包会合并成一个数据包回调,如果接收到数据包就处理业务,分拆的和合并的数据都会因为解析失败,导致业…...

鸿蒙UI开发——badge角标的使用

1、概 述 badge小红点角标是我们项目开发中常见的需求,信息标记组件,可以附加在单个组件上用于信息提醒的容器组件。效果如下: 2、Badge 接口定义如下: 👉🏻 根据数字创建标记组件; Badge(v…...

批量打印的趣事

前言 PC端网页打印大量数据的时候&#xff0c;比如批量打印100个标签&#xff0c;会出现打印样式混乱的问题 问题 数据可以设定100~自定义阈值 {data.map((_, idx) > {return <Tag qrCode啊程是个大帅逼 code{AB-${idx1}} title雷猴 key{idx} />})} 打印预览到第3…...

车载中央域控制器测试【BCM模块介绍-外灯3】

文章目录 1 摘要2 倒车灯2.1 倒车灯的作用与功能2.2 控制实现方案2.3 需求分析2.3.1系统需求2.3.2 功能安全需求&#xff08;ISO 26262 ASIL B&#xff09;*2.3.3 关联功能需求 3 角灯3.1 角灯&#xff08;Cornering Lamp&#xff09;核心作用与功能3.2 控制实现方案3.3 需求分…...

Linux系统基础——是什么、适用在哪里、如何选

一、Linux是什么 Linux最初是由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;基于个人兴趣爱好开发的个人项目&#xff0c;他编写了最核心的内核&#xff1b;后面为了发展壮大Linux系统他将整个项目开源到GitHub上&#xff0c;可以让全世界的人都参与到项目的开发维护中…...

MySQL与Oracle六大方面之比较

MySQL与Oracle作为两大主流关系型数据库&#xff0c;在功能、性能、适用场景等方面存在显著差异。以下是综合多个来源的全面对比分析&#xff1a; 1. 事务与并发控制 - 事务提交方式&#xff1a; - **MySQL**&#xff1a;默认自动提交&#xff08;可通过参数修改&#xff09;&…...

二层和三层交换机的概念

前言 交换机&#xff0c;和它最相关的莫过于Mac地址和在osi的数据链路层。本章的重点还是有请我们的小动物们出场&#xff0c;来一段小故事。 在交换机森林里&#xff0c;二层交换机&#x1f406;是独来独往的猎豹&#xff0c;靠MAC地址闪电般传递消息。一天&#xff0c;管理员…...

计算机网络学习20250524

协议 格式—语法&#xff1a;数据结构或格式&#xff08;怎么做&#xff09;次序—时序&#xff1a;事件实现的顺序&#xff08;做的顺序&#xff09;行为动作—语义&#xff1a;发出什么控制信息&#xff0c;完成何种动作、做出何种应答 网络结构 网络边缘&#xff1a;主机…...

无损图片压缩 本地处理 批量处理提升效率 无需联网+无广告

各位爱图人士们&#xff01;今天咱来聊聊速图压缩器&#xff0c;这可是个专注无损图片压缩的本地处理小能手&#xff01;它核心功能超牛&#xff0c;能在减少图片体积时还保持画质杠杠清晰。下面咱就详细说说它的主要功能和使用特点。 首先是无损压缩技术。它用高效压缩算法&a…...

C++标准库中 std::string 类提供的 insert 成员函数的不同重载版本

下图是C标准库中 std::string 类提供的 insert 成员函数的不同重载版本&#xff0c;可点击C标准库获取 以下是std::string::insert各重载版本的功能及参数解释&#xff1a; 1. 插入完整字符串 string& insert(size_t pos, const string& str); 功能&#xff1a;在字…...

Qt window frame + windowTitle + windowIcon属性(3)

文章目录 window frame属性window frame的概念1. window frame的影响2. 图片演示3. 代码演示 API接口widget.cpp&#xff08;测试代码&#xff09; windowTitle属性API接口问题 注意点widget.cpp&#xff08;属性用法&#xff09; windowIcon属性API接口啥是窗口图标玩法1. 先…...

解决:VMware 虚拟机 Ubuntu 系统共享文件夹无法访问问题

以下是解决 VMware 虚拟机 Ubuntu 系统共享文件夹无法访问 问题的完整过程总结&#xff0c;按关键步骤和逻辑顺序梳理&#xff1a; 系统版本&#xff1a;Ubuntu 22.04.5 1. 确认 VMware Tools 已安装 验证方法&#xff1a;通过 ps -ef | grep vmtoolsd 检查是否存在 vmtools…...

Dify源码学习

文章目录 1 大模型基本原理1.1 model_context_tokens、max_tokens和prompt_tokens1.1.1 三者之间的关系1.1.2 总结对比 2 Dify源代码2.0 前后端代码跑起来【0】准备开发环境【1】下载代码【2】运行后端&#xff08;1&#xff09;Start the docker-compose stack&#xff08;2&a…...

静态网站部署:如何通过GitHub免费部署一个静态网站

GitHub提供的免费静态网站托管服务可以无需担心昂贵的服务器费用和复杂的设置步骤&#xff0c;本篇文章中将一步步解如何通过GitHub免费部署一个静态网站&#xff0c;帮助大家将创意和作品快速展现给世界。 目录 了解基础情况 创建基础站点 在线调试站点 前端项目部署 部署…...

【拯救小狗】2022-1-3

缘由c学校练习试题&#xff0c;求解决-编程语言-CSDN问答 void 拯救小狗() {//缘由https://ask.csdn.net/questions/7622294?spm1005.2025.3001.5141int d 0, g 0, tfh[100][3]{}, x 0, c 10, dd d;std::cin >> d >> g; dd d;while (x < g && d…...

PS2025 v26.7 Photoshop2025+AI生图扩充版,支持AI画图

软件下载 【名称】&#xff1a;PS2025 v26.7 Photoshop2025AI生图扩充版 【大小】&#xff1a;4.9G 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win10/Win11 【网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; https://pan.quark.cn/s/51f5…...

怎么开发一个网络协议模块(C语言框架)之(三) 全局实例

1. gVrrpInstance 是什么? 这是 VRRP 全局控制结构体,命名为 vrrpGlbInstance_t,定义了整个协议运行时的 内核资源、全局状态、各类对象池、AVL 树、计时器、套接字等。 它本质上是一个单例(singleton),用于全局访问 VRRP 实例、资源、统计、socket 等。 vrrpGlbInsta…...

ShenNiusModularity项目源码学习(30:ShenNius.Admin.Mvc项目分析-15)

广告管理页面用于新建、维护及删除系统CMS管理模块的广告信息&#xff0c;其后台控制器类AdvListController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内&#xff0c;页面文件位于同项目的Areas\Cms\Views\AdvList内&#xff0c;其中Index.cshtml页面为主页面&#xf…...

香港维尔利健康科技集团全面推进AI医疗落地,构建智慧健康管理新模式

在人工智能重塑全球医疗格局的新浪潮中&#xff0c;香港维尔利健康科技集团再次抢占技术高地&#xff0c;宣布正式启动“AI医疗健康场景融合工程”&#xff0c;将人工智能深度嵌入健康管理的全链条服务之中。该计划不仅涵盖设备智能化、诊疗辅助算法、用户健康行为建模等核心环…...

在 .NET 环境下实现跨进程高频率读写数据

目录 ✅ 技术选型说明 &#x1f4e6; 示例场景 &#x1f9e9; 数据结构定义 &#x1f6a6; 核心同步机制 &#x1f9d1;‍&#x1f4bb; 消费者实现 ⚡ 性能优化技巧 &#x1f6e0; 部署注意事项 &#x1f4c8; 性能基准&#xff08;理论值&#xff09; 在 .NET 环境下…...

Arduino和STM32的区别详解

在嵌入式开发领域&#xff0c;Arduino和STM32是两类非常常见的微控制器平台。它们各有优缺点&#xff0c;适用于不同的开发需求。本文将从硬件架构、开发环境、易用性、性能、应用场景等方面对比两者的区别。 ## 一、硬件架构 ### Arduino - **核心芯片**&#xff1a;大多数Ar…...

选择合适的Azure数据库监控工具

Azure云为组织提供了众多服务&#xff0c;使其能够无缝运行应用程序、Web服务和服务器部署&#xff0c;其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成&#xff0c;具备可靠、易扩展和易管理的特性&#xff0c;不仅能提升数据库可用性与性能&#xff0c;同时…...

bi软件是什么?bi软件是做什么用的?

目录 一、BI 软件是什么 1. 基本概念 2. 工作原理 二、BI 软件是做什么用的&#xff1f; 1. 精准洞察市场趋势 2. 优化企业战略规划 3. 辅助投资决策 三、如何选择合适的 BI 软件 1.功能匹配度 2.易用性和可扩展性 3.数据安全和稳定性 4.技术支持和服务 总结 生产…...

DeepSeek 赋能智能电网:从技术革新到全场景应用实践

目录 一、智能电网的发展现状与挑战二、DeepSeek 技术解析2.1 DeepSeek 技术原理2.2 DeepSeek 技术优势 三、DeepSeek 在智能电网中的具体应用3.1 设备管理智能化3.2 电网运行优化3.3 客户服务提升3.4 规划建设智能化3.5 经营管理高效化3.6 办公辅助便捷化 四、DeepSeek 在智能…...

xdvipdfmx:fatal: File ended prematurely. No output PDF file written.

今天忽然遇到&#xff1a;使用xelatex或lualatex编译&#xff0c;一直卡住&#xff0c;不报错&#xff0c;也无法生成PDF&#xff0c;主动停止编译后就报错 xdvipdfmx:fatal: File ended prematurely. No output PDF file written. 然后&#xff0c;之前能正常编译的一些文件…...

python进行while遍历的常见错误解析

Python中使用while循环进行遍历时&#xff0c;常见的错误类型及解析如下&#xff1a; 一、循环条件错误 错误示例&#xff1a; i 0 lst [1,2,3] while i < len(lst): # 实际索引范围应为[0,2]print(lst[i])i 1错误分析&#xff1a; 当 i 3 i3 i3时&#xff0c;条件 …...

锐化算子构建方法(机翻)

为了充分利用 GIP&#xff08;通用图像处理单元&#xff09;的并行处理能力&#xff0c;像素组的规模保持较小。每组像素数量的最小化可最大化可并行实现的独立内核数量。理想情况下&#xff0c;若处理单元可获取给定邻域的每个像素值&#xff0c;则内核可完全通用&#xff08;…...