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

flask中的session介绍

在这里插入图片描述

flask中的session介绍

在Flask中,session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie,将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤:

首先,你需要设置一个秘钥,这是为了加密你的session数据:

from flask import Flask, sessionapp = Flask(__name__)# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

然后,你可以像操作字典一样操作session对象。以下是一个登录的例子:

from flask import Flask, session, redirect, url_for, escape, requestapp = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'#from flask import escape
# 假设 session['username'] 是 "<script>alert('hacked!');</script>"
#safe_username = escape(session['username'])
# safe_username 现在是 "&lt;script&gt;alert('hacked!');&lt;/script&gt;"
# escape(session['username'])是在做HTML转义@app.route('/')
def index():if 'username' in session:return 'Logged in as %s' % escape(session['username'])return 'You are not logged in'@app.route('/login', methods=['GET', 'POST'])
def login():error = Noneif request.method == 'POST':username = request.form['username']password = request.form['password']if valid_login(username, password):session['username'] = request.form['username']return redirect(url_for('index'))else:error = 'Invalid username or password'return render_template('login.html', error=error)@app.route('/logout')
def logout():# remove the username from the session if it's theresession.pop('username', None)return redirect(url_for('index'))

Flask的session实现涉及到几个关键的组件:session对象、session_interface对象以及secure_cookie模块。以下是这些组件是如何工作以实现Flask的session的:

  1. Session对象:在Flask中,session被表示为一个名为session的字典对象。它是LocalProxy的实例,LocalProxy是一种可以动态引用当前运行环境(比如请求或应用上下文)的特定对象的代理类。当你尝试访问session对象的属性或方法时,LocalProxy会将这些操作转发到实际的会话对象,这个实际的会话对象由session_interface创建。
  2. SessionInterface对象SessionInterface是一个抽象基类,定义了用于处理session的接口。Flask自带的SecureCookieSessionInterface实现了这个接口,使用安全的签名cookie来存储session数据。当一个请求开始时,SecureCookieSessionInterface会从请求的cookies中提取出session数据,并创建一个新的SecureCookieSession对象。当请求结束时,如果SecureCookieSession对象被修改,SecureCookieSessionInterface会把它序列化并签名,然后存回到客户端的cookies中。【文末附源码解释】
  3. SecureCookie模块:这个模块实现了SecureCookieSession类,SecureCookieSession是一个用于存储实际session数据的字典子类,它的工作方式和普通的字典一样。

整体来看,Flask的session实现工作流程是这样的:

  • 当一个请求开始时,Flask会创建一个新的请求上下文,并通过SecureCookieSessionInterface从请求的cookies中提取出session数据,然后创建一个新的SecureCookieSession对象。
  • 当你在你的视图函数中操作session对象(比如设置session['username'] = 'John')时,实际上你是在操作这个SecureCookieSession对象。
  • 当请求结束时,Flask会检查SecureCookieSession对象是否被修改。如果被修改,Flask会通过SecureCookieSessionInterfaceSecureCookieSecureCookieSession对象序列化并签名,然后把它存回到响应的cookies中。
  • 当下一个请求来到时,这个过程会再次重复。

通常流程总结

  1. 当一个新用户(没有任何session数据的用户)首次访问你的Flask应用时,他们的请求中不会包含任何session数据。在这种情况下,Flask会为这个用户创建一个新的、空的session对象。这个新的session对象在初始状态下是空的,也就是说,它不包含任何数据。
  2. 如果在处理这个请求的过程中,你的代码修改了session对象(例如,通过设置session['username'] = 'John'),那么当请求结束时,Flask会把这个session对象序列化并签名,然后存入一个新的Cookie中。这个新的Cookie会被发送到客户端,一起与响应一起传送。
  3. 当这个用户下次访问你的Flask应用时,他们的请求将会携带这个包含了session数据的Cookie。Flask会在接收到这个请求时,从Cookie中提取出session数据,并创建一个新的session对象。这样,你的代码就可以继续访问和修改这个session对象了。

需要注意的是,如果一个请求没有修改session对象,那么Flask就不会在响应中设置新的Cookie。这是因为,没有必要把一个没有变化的session数据再次发送到客户端。

因此,即使一个新用户的首次请求中没有包含任何session数据,Flask也能正确地处理

SecureCookieSessionInterface

class SecureCookieSessionInterface(SessionInterface):"""The default session interface that stores sessions in signed cookiesthrough the :mod:`itsdangerous` module."""#: the salt that should be applied on top of the secret key for the#: signing of cookie based sessions.salt = "cookie-session"#: the hash function to use for the signature.  The default is sha1digest_method = staticmethod(hashlib.sha1)#: the name of the itsdangerous supported key derivation.  The default#: is hmac.key_derivation = "hmac"#: A python serializer for the payload.  The default is a compact#: JSON derived serializer with support for some extra Python types#: such as datetime objects or tuples.serializer = session_json_serializersession_class = SecureCookieSessiondef get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None:if not app.secret_key:return Nonesigner_kwargs = dict(key_derivation=self.key_derivation, digest_method=self.digest_method)return URLSafeTimedSerializer(app.secret_key,salt=self.salt,serializer=self.serializer,signer_kwargs=signer_kwargs,)def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None:s = self.get_signing_serializer(app)if s is None:return Noneval = request.cookies.get(self.get_cookie_name(app))if not val:return self.session_class()# 获取session的最大有效期,单位为秒。max_age = int(app.permanent_session_lifetime.total_seconds())try:# 尝试使用序列化器s的loads方法,对session cookie的值val进行反序列化和签名验证。如果反序列化和验证成功,就用这些数据创建一个新的session对象,并返回data = s.loads(val, max_age=max_age)return self.session_class(data)except BadSignature:return self.session_class()def save_session(self, app: Flask, session: SessionMixin, response: Response) -> None:name = self.get_cookie_name(app)domain = self.get_cookie_domain(app)path = self.get_cookie_path(app)secure = self.get_cookie_secure(app)samesite = self.get_cookie_samesite(app)httponly = self.get_cookie_httponly(app)# Add a "Vary: Cookie" header if the session was accessed at all.if session.accessed:response.vary.add("Cookie")# If the session is modified to be empty, remove the cookie.# If the session is empty, return without setting the cookie.if not session:if session.modified:response.delete_cookie(name,domain=domain,path=path,secure=secure,samesite=samesite,httponly=httponly,)response.vary.add("Cookie")returnif not self.should_set_cookie(app, session):returnexpires = self.get_expiration_time(app, session)val = self.get_signing_serializer(app).dumps(dict(session))  # type: ignoreresponse.set_cookie(name,val,  # type: ignoreexpires=expires,httponly=httponly,domain=domain,path=path,secure=secure,samesite=samesite,)response.vary.add("Cookie")
  1. SecureCookieSessionInterface类:这个类实现了session接口,使用安全的签名cookies来存储session数据。
  2. 类属性:
    • salt:加盐值,用于混淆session的加密过程,增加安全性。
    • digest_method:哈希函数,用于签名过程中对数据进行哈希处理,默认为sha1。
    • key_derivation:关键字派生,设置为"hmac",表示使用HMAC进行签名。
    • serializer:序列化器,用于将Python对象转换为可以在网络上传输的格式,这里使用的是JSON序列化器。
    • session_class:表示session的类,默认为SecureCookieSession。
  3. get_signing_serializer方法:用于获取一个签名序列化器,其作用是用来签名和反签名cookies的。如果应用没有设置秘钥app.secret_key,则返回None。
  4. open_session方法:在处理每个请求时调用,从请求的cookies中提取出session数据,反序列化并验证签名,得到session的数据。如果签名不合法,就会抛出BadSignature异常,然后返回一个空的session。
  5. save_session方法:在每个请求处理完后调用,将session数据序列化,签名,然后存入到响应的cookies中。如果session为空且已被修改,则删除cookie。只有当session被访问过或被修改,才会设置Vary: Cookie头。

在使用SecureCookieSessionInterface处理session时,Flask会保证session的安全性,即使session数据存储在客户端的cookies中,也无法被篡改,因为每个session cookie都被签名了。除非知道服务器的秘钥,否则无法伪造有效的session cookie。

相关文章:

flask中的session介绍

flask中的session介绍 在Flask中&#xff0c;session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie&#xff0c;将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤&#xff1a; 首先…...

记录联想拯救者R720重装系统

文章目录 bios里找不到U盘启动项2023.7.23重装系统后数据记录C盘内存修改默认AppData的路径&#xff08;亲测&#xff0c;没用&#xff09; bios里找不到U盘启动项 制作好启动盘后&#xff0c;开机按F2进入bios后&#xff0c;找不到U盘启动项&#xff0c;如下图所示&#xff1…...

Spring Alibaba Sentinel实现集群限流demo

1.背景 1.什么是单机限流&#xff1f; 小伙伴们或许遇到过下图这样的限流配置 又或者是这样的Nacos动态配置限流规则&#xff1a; 以上这些是什么限流&#xff1f;没错&#xff0c;就是单机限流&#xff0c;那么单机限流有什么弊端呢&#xff1f; 假设我们集群部署3台机器&a…...

102、SOA、分布式、微服务之间有什么关系和区别?

SOA、分布式、微服务之间有什么关系和区别? 分布式架构是指将单体架构中的各个部分拆分&#xff0c;然后部署到不同的机器或进程中去&#xff0c;SOA和微服务基本上都是分布式架构师SOA是一种面向服务的架构&#xff0c;系统的所有服务都注册在总线上&#xff0c;当调用服务时…...

Ubuntu 20.04下的录屏与视频剪辑软件

ubuntu20.04下的录屏与视频剪辑 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 2、设置录制窗口参数 3、开始录制 二、视频剪辑软件kdenlive的安装 1、安装 2、启动 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 &#xff08;1&#xff09;直接在终端输入以下命…...

面试题 -- iOS数据存储

文章目录 一、如果后期需要增加数据库中的字段怎么实现&#xff0c;如果不使用CoreData呢&#xff1f;二、SQLite 数据存储是怎么用&#xff1f;三、简单描述下客户端的缓存机制&#xff1f;四、实现过多线程的Core Data 么&#xff1f;NSPersistentStoreCoordinator&#xff0…...

spring复习:(51)environment、systemProperties、systemEnvironment三个bean是在哪里被添加到容器的?

一、主类&#xff1a; package cn.edu.tju.study.service.anno;import cn.edu.tju.study.service.anno.config.MyConfig; import cn.edu.tju.study.service.anno.domain.Person; import com.sun.javafx.runtime.SystemProperties; import org.springframework.context.annotat…...

element ui 上传控件携带参数到后端

1.携带固定参数&#xff1a; 2.携带不固定参数&#xff1a; <el-row> <el-col :span"24"> <el-upload :multiple"false" :show-file-list"false" :on-success"f_h…...

scrapy分布式+指纹去重原理

1&#xff0c;指纹去重原理存在于 scrapy.util.requests 里面 需要安装的包 pip install scrapy-redis-cluster # 安装模块 pip install scrapy-redis-cluster0.4 # 安装模块时指定版本 pip install --upgrade scrapy-redis-cluster # 升级模块版本 2&#xff0c;setting配置 …...

FileHub使用教程:Github Token获取步骤,使用快人一步

FileHub介绍 filehub是我开发的一个免费文件存储软件&#xff0c;可存万物。软件仓库&#xff1a;GitHub - Sjj1024/s-hub: 一个使用github作为资源存储的软件 软件下载地址&#xff1a;。有问题可以留言或者提Issue&#xff0c; 使用第一步&#xff1a;获取Github Token 使…...

嵌入式开发:单片机嵌入式Linux学习路径

SOC&#xff08;System on a Chip&#xff09;的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片&#xff0c;如STM32和NXP LPC1xxx系列&#xff0c;不具备MMU&#xff08;Memory Management Unit&#xff09;&#xff0c;适用于轻量级实时操作系统如uCOS和FreeRTOS。…...

Libvirt的virsh工具常用命令

在使用Libvirt的virsh工具时&#xff0c;以下是常见的一些命令&#xff1a; 连接到Hypervisor&#xff1a; virsh -c <URI>&#xff1a;连接到指定的Hypervisor&#xff0c;例如 virsh -c qemu:///system 连接到本地的QEMU/KVM Hypervisor。 虚拟机管理&#xff1a; list…...

高斯消元解异或方程组写法

高斯约旦消元解异或方程组 for(int j1;j<n;j){for(int ij1;i<n;i)if(a[i][j]){swap(a[i],a[j]);break;}if(!a[i][i]){if(a[i][n1])//no...else ...//mul}for(int i1;i<n;i)if(i!j&&a[i][j])for(int kj;k<n1;k)a[i][k]^a[j][k];}正常高斯消元法 int r1;for…...

前端 mock 数据的几种方式

目录 接口demo Better-mock just mock koa webpack Charles 总结 具体需求开发前&#xff0c;后端往往只提供接口文档&#xff0c;对于前端&#xff0c;最简单的方式就是把想要的数据写死在代码里进行开发&#xff0c;但这样的坏处就是和后端联调前还需要再把写死的数据…...

【GO】go语言入门实战 —— 猜数字游戏

文章目录 程序介绍设置随机数读取用户输入实现判断逻辑实现游戏循环完整代码 程序介绍 首先生成一个介于1~100之间的随机数&#xff0c;然后提示玩家输入数字&#xff0c;并告诉玩家是猜对了还是猜错了&#xff0c;如果对了程序就结束&#xff0c;如果错了就提醒玩家是大了还是…...

opencv-25 图像几何变换04- 透视 cv2.warpPerspective()

什么是透视&#xff1f; 透视是一种几何学概念&#xff0c;用于描述在三维空间中观察物体时&#xff0c;由于视角的不同而产生的变形效果。在现实世界中&#xff0c;当我们从不同的角度或位置观察物体时&#xff0c;它们会呈现出不同的形状和大小。这种现象被称为透视效果。 透…...

视频讲解Codeforces Round 887 (Div. 2)(A--C)

文章目录 A. Desorting1、板书2、代码 B. Fibonaccharsis1、板书2、代码 C. Ntarsis Set1、板书2、代码 视频讲解Codeforces Round 887 (Div. 2)&#xff08;A–C&#xff09; A. Desorting 1、板书 2、代码 #include<bits/stdc.h> #define endl \n #define INF 0x3f…...

【团队协作开发】将Gitee项目导入到本地IDEA中出现根目录不完整的问题解决(已解决)

前言&#xff1a;在团队协作开发过程中&#xff0c;通常我们的Gitee完整项目中会包含很多内容&#xff1a;后端代码、前端代码、项目结构图、项目文档等一系列资产。 将Gitee项目导入到本地IDEA中&#xff0c;通常会出现根目录不完整的问题。这是因为项目里面包含了后端代码、前…...

vue-pdf 单列显示多个pdf页面

<template><div><pdfv-for"i in numPages":key"i":src"src":page"i"style"display: inline-block; width: 100%"></pdf> <!-- 宽度设置100% 一行只展示一页 --></div> </template&g…...

2023年FPGA好就业吗?

FPGA岗位有哪些&#xff1f; 从芯片设计流程来看&#xff0c;FPGA岗位可以分四类 产品开发期&#xff1a;FPGA系统架构师 芯片设计期&#xff1a;数字IC设计工程师、FPGA开发工程师 芯片流片期&#xff1a;FPGA验证工程师 产品维护期&#xff1a;FAE工程师 从行业上来说&#x…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...