flask-login会话保持实现

目录

1、实现原理

1. 用户登录过程

2. 判断用户是否登录的原理

3. 注销过程

2、示例使用 

1、实现原理

1. 用户登录过程

当用户通过表单提交用户名和密码进行登录时,后端会进行身份验证。如果验证通过,Flask-Login 会执行以下操作:

  • 记录会话:将用户ID等信息写入到 Flask 的 session 中,以便后续请求能够识别用户身份。
  • 设置上下文:同时,Flask-Login 会在请求上下文中设置当前用户(current_user),这是一个 LocalProxy 对象,封装了对用户信息的访问。

2. 判断用户是否登录的原理

在 Flask-Login 中,判断用户是否登录主要依赖于以下几个组件和机制:

  • current_user 属性
    • current_user 是一个 LocalProxy 对象,它封装了对当前用户信息的访问。在 Flask 应用中,可以通过 from flask_login import current_user 来导入并使用它。
    • 当需要判断用户是否登录时,可以直接调用 current_user.is_authenticated 属性。这个属性是一个布尔值,当用户已登录时返回 True,否则返回 False
  • is_authenticated 属性
    • 用户类(通常是继承自 UserMixin 的类)需要实现 is_authenticated 属性。这个属性用于表示用户是否已通过身份验证。
    • 在 Flask-Login 中,current_user 对象通过代理机制访问用户类的 is_authenticated 属性来判断用户是否登录。
  • @login_required 装饰器
    • Flask-Login 提供了 @login_required 装饰器,用于保护需要登录才能访问的视图函数。
    • 当未登录用户尝试访问被 @login_required 装饰的视图函数时,Flask-Login 会自动重定向用户到登录页面(除非配置了其他处理方式)。
    • @login_required 装饰器内部通过检查 current_user.is_authenticated 来判断用户是否已登录。
  • user_loader 回调函数
    • Flask-Login 要求实现一个 user_loader 回调函数,用于从 session 中的用户ID加载用户对象。
    • 这个回调函数在每次请求时都会被调用(特别是在需要判断用户是否登录时),以确保 current_user 对象能够正确地反映当前用户的身份。

3. 注销过程

当用户注销时,Flask-Login 会清除 session 中的用户相关信息,并将 current_user 设置为匿名用户对象。这样,后续请求就无法再通过 current_user.is_authenticated 判断用户为已登录状态。

2、示例使用 

from flask import Flask, request, redirect, url_for, render_template  
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user  app = Flask(__name__)  
app.secret_key = 'your_secret_key'  # 用户模型  
class User(UserMixin):  def __init__(self, id, username, password):  self.id = id  self.username = username  self.password = password  # 用户数据库(示例使用字典模拟)  
users_db = {  1: User(1, 'user1', 'password1'),  2: User(2, 'user2', 'password2')  
}  # 用户加载器回调函数  
def user_loader(user_id):  return users_db.get(int(user_id))  # 初始化 Flask-Login  
login_manager = LoginManager()  
login_manager.init_app(app)  
login_manager.user_loader(user_loader)  @app.route('/')  
def index():  return render_template('index.html')  @app.route('/login', methods=['GET', 'POST'])  
def login():  if request.method == 'POST':  username = request.form['username']  password = request.form['password']  user = users_db.get(username)  # 假设用户名是唯一的,并且用作字典的键(实际中应使用 ID)  if user and user.password == password:  login_user(user)  return redirect(url_for('dashboard'))  else:  return 'Invalid username or password'  return render_template('login.html')  @app.route('/welcome')  
@login_required  
def dashboard():  return f'Welcome, {current_user.username}!'  @app.route('/logout')  
@login_required  
def logout():  logout_user()  return redirect(url_for('index'))  if __name__ == '__main__':  app.run(debug=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝兰德参编金融智能体标准,深耕大模型场景化落地

随着数智化浪潮的不断推进,人工智能技术正深刻影响着金融服务的模式和流程,金融智能体在大模型的加持下,业务场景的应用能力得到强化。然而,作为新型技术,金融智能体在隐私保护、透明性、数据泄露等方面仍存在诸多风险…

枸杞糖基转移酶--文献精读31

Functional and structural dissection of glycosyltransferases underlying the glycodiversity of wolfberry-derived bioactive ingredients lycibarbarspermidines 功能和结构分析导致枸杞来源的生物活性成分(如lycibarbarspermidines类化合物)糖基…

SQL注入安全漏洞与防御策略

1.引言 SQL注入(SQL Injection)是一种广泛存在的网络安全攻击手段,它允许攻击者通过向应用程序的数据库查询中插入或“注入”恶意的SQL代码片段,从而操控后端数据库,执行未授权的数据库操作,如数据泄露、数…

C++入门基础知识2

1.引用 1.1引用的使用 1.引用在实践中主要是引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象 2.引用传参跟指针传参功能是类似的,引用传参相对更方便一些 3.引用和指针在实践中相辅相成,功能有重叠性,各有特…

ES6 Module 的语法(十二)

ES6(ECMAScript 2015)引入了模块(Modules)的概念,使得JavaScript代码可以更容易地组织和复用。 1. export 关键字 命名导出 (Named Exports) 你可以使用 export 关键字导出多个变量、函数或类。 // module.js export…

嵌入式C++、Qt/QML和MQTT:智能工厂设备监控系统的全流程介绍(附代码示例)

1. 项目概述 本项目旨在开发一套先进的智能工厂设备监控系统,集成嵌入式技术、工业通信协议和人机界面等多项技术,实现对工厂设备的全方位实时监控、高精度数据采集和智能化分析。该系统将显著提升工厂设备的运行效率,大幅降低维护成本&…

【第33章】MyBatis-Plus之预防安全漏洞

文章目录 前言一、什么是漏洞?二、如何预防漏洞1.表字段部分2.字段参数/变量部分3. 使用工具类预防 三、关于恶意漏洞的说明总结 前言 软件漏洞可以对系统造成严重危害,如果被人恶意利用,会导致病毒感染、数据泄漏或损坏的风险,还…

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…

thinkphp5多层with关联查询错误问题

官方文档 https://www.kancloud.cn/manual/thinkphp5/139045 V5.0.7版本以上,支持使用数组方式定义嵌套预载入,例如下面的预载入要同时获取用户的Profile关联模型的Phone、Job和Img子关联模型数据: $list User::with([profile>[phone,j…

TS类型声明文件(一)如何在ts npm包项目中生成 d.ts 文件

现在TS项目很多,如果你开发的npm包不支持类型声明文件,对使用ts的开发者不太友好,开发者无法获得ts类型提示。如何在自己的 npm 包中自带 .d.ts 文件,以确保使用者不需要额外配置 tsconfig.json 就能获得类型提示,以下…

Python练习题(3)

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用文件流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import requests import jsondef copy(src, dst):read_file o…

【typedb】例子:药物发现 1: 模式导入

typedb-examples/drug-discovery/ Drug discovery监听0.0.0.0:1729 但这么连接肯定不行: localhost:1729 可以: 一直无法点击schema图标:先创建一个数据库 选中数据库: 选中后就可以了:

我的第128天创作纪念日

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈初阶数据结构笔记专栏: 初阶数据结构笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章…

演示:【Avalonia-Controls】Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库

一、目的:分享一个Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库 开源地址: GitHub - HeBianGu/Avalonia-Controls: Avalonia控件库 Nuget包地址: NuGet Gallery | Packages matchin…

02MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件 画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本 定时器与定时事件

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体,但是有些不需要预测类别,只要检测出框就行。在很多场合也有应用场景,有点像类无关…

Memcached vs Redis——Java项目缓存选择

在Java项目开发中,缓存系统作为提升性能、优化资源利用的关键技术之一,扮演着至关重要的角色。Memcached和Redis作为两种流行的缓存解决方案,各有其独特的优势和应用场景。本文旨在通过分析项目大小、用户访问量、业务复杂度以及服务器部署情…

Chubby VS Zookeeper

Chubby 和 Zookeeper 是两种分布式协调服务,主要用于管理分布式系统中的配置、同步和命名等任务。以下是对这两种系统的比较: Chubby 开发者:由 Google 开发和使用,作为其内部服务的一部分。 设计目标:为 Google 的…

ABAP中将采购订单的预制发票过账的BAPI的使用方法

在ABAP中,将采购订单的预制发票过账的BAPI主要是BAPI_INCOMINGINVOICE_POST。这个BAPI用于将之前通过BAPI_INCOMINGINVOICE_PARK等函数创建的预制发票过账到SAP系统中,生成相应的会计凭证。 使用方法 以下是使用BAPI_INCOMINGINVOICE_POST的基本步骤&a…

力扣 爬楼梯

动态规划算法基础篇。 class Solution {public int climbStairs(int n) {int[] f new int[n 1];f[0] 1;f[1] 1;//当爬到n阶楼梯时&#xff0c;可知是由n-1阶或n-2阶楼梯而来for(int i 2; i < n; i) {f[i] f[i - 1] f[i - 2];//后面的每一阶种数由前两个状态得到}ret…