(十二)Flask重点之session

news2024/11/15 12:38:10

session

自我介绍&基本使用:

在Flask中,Session是一种用于在客户端和服务器之间存储和传输数据的机制。它允许您在用户与应用程序之间保持状态,并且可以存储和检索有关特定用户的信息。

Flask使用Werkzeug库提供的SecureCookie来实现Session功能。默认情况下,Flask会为每个客户端生成一个唯一的Session ID,并将该ID存储在Cookie中发送给客户端。然后,Flask将Session数据存储在服务器端,并根据Session ID将相应的数据与请求进行关联。

实战使用Flask Session:

from flask import Flask, session

app = Flask(__name__)    # 创建Flask应用程序对象
app.secret_key = 'GuHanZheIsCool'    # 设置Secret Key


@app.route("/x1")
def index():
    # 通过session字典设置session数据
    session['name'] = '小明'
    return 'Index'


@app.route("/x2")
def index():
    # 通过session字典获取session数据
    print(session['name'])
    return 'Order'


if __name__ == '__main__':
    app.run()
    

以上是使用Flask中Session的基本步骤。通过在Session中存储用户的信息,您可以跟踪用户的状态,并在不同请求之间共享数据。

需要注意的是:设置Secret Key是必要的,因为它用于对Session数据进行加密和解密,以确保数据的安全性(你可以试试不设置,会报错~)。

然而,**请注意Session数据默认存储在服务器端,在高流量的情况下可能会对服务器造成负担。**如果需要存储大量或敏感数据,请考虑使用数据库或其他外部存储解决方案来代替默认的Session机制。

分析session会是个什么?

正如我上面那个实例代码中的注释所写—session是一个dict(字典)对象。但是知其然更要知其所以然,所以下面来理性分析一波如何能看出它是一个dict(字典)对象【先理论分析,后扒源码】~

session['name'] = '小明'

session['name'] 
  • 情况一:

    在Python中很容易想到,如果有个玩意可以通过上两行代码所示方式进行操作,那么这个玩意很大可能是个对象。那么的话,这两个操作将会调用对象的__setitem____getitem__方法。

    当使用session['name'] = '小明'时,会调用session对象的__setitem__方法,该方法用于设置键值对。

    当使用session['name']时,会调用session对象的__getitem__方法,该方法用于获取键对应的值。

    示例代码如下:

class Session:
    def __init__(self):
        self.data = {}

    def __setitem__(self, key, value):
        self.data[key] = value

    def __getitem__(self, key):
        return self.data[key]

session = Session()
session['name'] = '小明'  # 调用 __setitem__ 方法
value = session['name']  # 调用 __getitem__ 方法
print(value)  # 输出: 小明

在上述示例中,我们定义了一个Session类,其中实现了__setitem____getitem__方法来模拟session对象的行为。通过调用session['name'] = '小明'session['name'],分别触发了对应的方法,实现了键值对的设置和获取操作。


那么,还有什么其他的可能吗?

  • 情况二:

    可不能忘了字典哦~

"""
v = dict()    
v['name'] = '小明'
v['name']

所以,如果一个类继承dict的话也可以!
"""
class Foo2(dict):
    pass


obj = Foo2()
obj['xxx'] = '小明'

而Flask里的session源码就是使用的上述情况二,姑且称之为特殊的字典(字典有的它都有,字典没有的它也可以有【可以额外自定义一些功能】)。

扒扒源码:

请求一进来,立即执行app对象【app = Flask(__name__) # 创建Flask应用程序对象】的call()方法。

在这里插入图片描述

继续进:

下图这个函数的参数environ就是请求相关的原生字符串数据,那么源码肯定有相关的处理逻辑,来处理environ为易于使用的数据结构。

在这里插入图片描述

所以继续进self.request_context(environ)【返回的self就是最原始的app对象】:

在这里插入图片描述

继续进:

在这里插入图片描述

继续进第一个红框:

在这里插入图片描述

所以第一个红框就是将environ最终交给Request类来进行处理【加工处理原生的请求相关数据】,最后再返回给request对象!

还记得从Flask里导出的request对象具备好多方法不,比如:request.args、request.methods等。这些就是上述Request类对原生数据加工处理之后才有的~

而第二个红框,又说明当用户请求第一次进来时,session设置为空。

往外出几层:

可见ctx里既有request对象又有session对象!!!拿到ctx的话就拿到了这俩~

在这里插入图片描述

继续走,即上图中的ctx.push()

下述红框就是给session赋值【红框第三句,传self.request参数是因为cookie在request对象中~】

在这里插入图片描述

session_interface

在这里插入图片描述

即:self.session = SecureCookieSessionInterface().open_session(self.app, self.request)

open_session

在这里插入图片描述

用户请求第一次进来,val是为空的,所以直接返回self.session_class()

回到最初的起点:

在这里插入图片描述

继续进self.session_class()看看:

在这里插入图片描述

继续看其继承的父类CallbackDict

继承了字典!!!

在这里插入图片描述

所以,就说明下图这里session现在是一个特殊的字典:

在这里插入图片描述

回到最开始session的使用,当用户的第一次请求到来还没到视图时,会将ctx里的session设置为空,当进入视图执行session['name'] = '小明'这一句时会去ctx里获取session并设置相应的键值。

当设置完session后,继续走源码:

视图函数执行走这:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

进去:

首先把特殊的字典session转换为字典,然后dumps,得到的val就是序列化的结果。

在这里插入图片描述

下次这个用户请求再进来,session就有值了,就走另一条路了:

loads就是反序列化成字典data,然后self.session_class(data)再放到特殊的字典里。

在这里插入图片描述

整个流程:

1. 请求刚刚到来:
	ctx = RequestContext(...)
		  - request
		  - session = None
	ctx.push()
		  ctx.session = SecureCooieSessionInterface.open_session()

2. 视图函数

3. 请求结束
		 ctx.session = SecureCooieSessionInterface.save_session()

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

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

相关文章

[黑马程序员SpringBoot2]——开发实用篇2

目录: Mongodb简介Mongodb下载与安装Mongodb基础操作Sprintboot整合MongodbES简介ES下载与安装ES索引操作ES文档操作SpringBoot整合ES客户端操作添加文档查询文档缓存的作用Spring缓存使用方式手机验证码案例-生成验证码手机验证码案例-验证码校验变更缓存供应商Eh…

逐字节讲解 Redis 持久化(RDB 和 AOF)的文件格式(一)

前言 相信各位对 Redis 的这两种持久化机制都不陌生,简单来说,RDB 就是对数据的全量备份,AOF 则是增量备份,而从 4.0 版本开始引入了混合方式,以 7.2.3 版本为例,会生成三类文件:RDB、AOF 和记…

6.10二叉树的所有路径(LC257-E,不太会)

算法: 前序遍历: 因为要让父节点指向孩子节点,才能输出路径。 递归与回溯相辅相成,只要有递归,就一定有回溯。 举个例子理解一下: 中:先push入1 左:再Push入2 右:再…

Linux系统编程 day03 Makefile、gdb、文件IO

Linux系统编程 day03 Makefile、gdb、文件IO 1. Makefile2. gdb3. 文件IO 1. Makefile Makefile文件中定义了一系列规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至更加复杂的功能操作。Makefile就像一个shell脚…

详解“协方差”与“相关系数”

引言 PCA的目标对象是矩阵,例如,有m个样本,每个样本有n个特征,那么就可以构造成一个样本矩阵,并转换成矩阵的形式。 PCA的最终目的是减少特征的个数,去掉那些不重要的特征,也就是减小矩阵列向量…

【LeetCode:689. 三个无重叠子数组的最大和 | 序列dp+前缀和】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

在回调之间共享数据

可以在 App 中为 UI 组件编写回调函数,以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中,回调函数通常必须访问主 App 函数中定义的数据,或与其他回调函数共享数据。例如,如果创建一个具有列表框的 App&a…

vue 如何实现粘贴复制功能

实现粘贴复制功能 vue 实现粘贴复制功能,也可用于app中h5插件,共四种方法,特别推荐第四种方法,具体还需了解根据需求使用 1. 安装第三方插件方法(不推荐) 这种方法兼容性很好,如果项目只使用了…

如何自己生成fip.bin在Milkv-duo上跑freertos

前言 (1)PLCT实验室实习生长期招聘:招聘信息链接 (2)本来是要跑RT-Thread的,搞了很久,一直没成功。哭死,后面mentor通电话,让我先跑一下freertos试试。有可能是因为RT-Th…

这5款好用的app,能让你生活质量和效率飙升

随着科技的进步和智能手机的普及,不少好用的手机APP出现让我们的生活更加便捷,也提升了我们的生活质量,带给我们不少惊喜。接下来,让我们一起探索这5款实用APP,看看有没有适合你的! 1、粉笔 一款专门备考…

全屋智能:鱼很大,但水更深

1990年,作为世界首富的比尔盖茨,已经对智能家居生活有了明确畅想。他花了7年时间,耗资1亿多美元,在美国西雅图的华盛顿湖东岸,建了一座占地6600平方米的湖滨别墅。在这座被命名为“未来之屋”的豪宅里,到处…

暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent

RPA暖阳脚本 近日,来自清华大学的研究人员联合面壁智能、中国人民大学、MIT、CMU 等机构共同发布了新一代流程自动化范式 “智能体流程自动化” Agentic Process Automation(APA),结合大模型智能体帮助人类进行工作流构建&#x…

OTP语音芯片 NV080D在智能空气检测仪的应用

随着人们对健康和环保的关注度不断提高,人们对看不见的家居环境也越来越重视。智能空气检测仪的市场需求也在不断增长中,呈现稳中向好的趋势。智能空气检测仪能够检测室内空气中的PM2.5、甲醛、TVOC等有害物质,同时还可以检测温湿度、空气质量…

亚马逊云科技帮助客户在云中构建具有高可靠性和韧性的应用程序

在一个理想的世界里,一切都非常完美,并且一直都在顺畅运作。早晨的通勤没有交通堵塞,最喜欢的停车位一直空着,一杯温度适宜的饮料,生活一帆风顺,没有任何中断。在需要时,您能得到所需的东西。但…

如何简单挖掘公益SRC?

目录 1、寻找漏洞 1)谷歌语法 2)fofa 2、挖掘漏洞 3、提交报告 第一步:“标题”和“厂商信息”和“所属域名” 第二步:其它内容 第三步:复现步骤 0、IP域名归属证明 1、漏洞页 2、该干啥 3、注入的结果 4、上榜吉时 时间&#x…

多视图聚类的论文阅读(一)

当聚类的方式使用的是某一类预定义好的相似性度量时, 会出现如下情况: 数据聚类方面取得了成功,但它们通常依赖于预定义的相似性度量,而这些度量受原始方法的影响:当输入维数相对较高时,往往是无效的。 1. Deep Mult…

asp.net校园二手交易平台系统VS开发sqlserver数据库web结构c#编程计算机网页

一、源码特点 asp.net校园二手交易平台系统 是一套完善的web设计管理系统,系统采用mvc模式(BLLDALENTITY)系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 vs2010,数据库为sqlserver2008&a…

网络渗透测试(TCP/IP)理论篇

TCP/IP体系 垂直服务:底层为高层服务 TCP/IP体系结构是一个分层的协议体系,由多个层次组成,每个层次都负责不同的功能。以下是TCP/IP体系结构的主要层次: 物理层(Physical Layer):该层负责传输…

15篇MyBatis-Plus系列集合篇「值得收藏学习」

历史文章(文章累计490) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 M…

向量数据库——AI时代的基座

1.前言 向量数据库在构建基于大语言模型的行业智能应用中扮演着重要角色。大模型虽然能回答一般性问题,但在垂直领域服务中,其知识深度、准确度和时效性有限。为了解决这一问题,企业可以利用向量数据库结合大模型和自有知识资产,…