(十二)Flask重点之session

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.mfbz.cn/a/167111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【活动回顾】ABeam News | 庆祝ABeam德硕与毕博中国战略合作十周年,关系再升级

国家会展中心 Date.2023.11.6 ​China International Import Expo 上周,ABeam作为毕博中国长期的战略合作伙伴,受邀出席了毕博中国在第六届进博会展台召开的战略合作十周年庆祝仪式。 本次战略合作庆祝仪式在进博会这个充满活力、创新与友谊的舞台举…

小红书软文种草怎么做,新产品上市软文创作技巧!

很多品牌有新品上市时都会借助软文传播来打开销路。因此,软文的质量几乎决定了新产品的营销结果。今天为大家分享下小红书软文种草怎么做,新产品上市软文创作技巧! 一、新品上市软文撰写的三大重点 1、确定软文撰写角度 新品上市软文&#xf…

calibre更新 环境变量设置

我这里是从别的地方copy过来的calibre,所以不用安装。 如果需要安装请参考: Caibre2022.3_17版本安装及遇到问题 - 梅希的日志 - EETOP 创芯网论坛 (原名:电子顶级开发网) -将copy过来的calibre放在原来calibre的位置。 打开工作路径下的.b…

1688阿里巴巴官方开放平台API接口获取商品详情、商品规格信息列表、价格、宝贝详情数据调用示例说明

商品详情API接口在电商平台和购物应用中的作用非常重要。它提供了获取商品详细信息的能力,帮助用户了解和选择合适的商品,同时也支持开发者进行竞品分析、市场研究和推广营销等工作,以提高用户体验和促进销售增长。 1688.item_get-获得1688商…

单片微机原理与接口技术期末复习

第二章: STC15F2K60S2 参数含义 (1)“STC”代表的含义是不能在应用中访问程序存储器,但设置了可单独访问的数据 Flash 区域。 (2)F :工作电源为5V。 (3)2k:片…

letcode::最小栈

最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。…

Wireshark网络工具

Wireshark是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。 Wireshark是一个免费开源软件,不需要付费,免费使用,可以直接登陆到Wireshark的官网下载安装。 在windows环境中&#x…

IDEA运行 支付宝案例

我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 🏷️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

SOLIDWORKS2024钣金及结构系统功能增强

SOLIDWORKS钣金和结构系统是大家比较熟悉的模块了,在新版本中钣金和结构系统功能也做了相应的优化。接下来让我们看看在SOLIDWORKS 2024中钣金和结构系统有哪些功能增强。 首先是钣金方面,我们先来看看新增的槽口延伸功能,在装配体零部件中创…

AIGC创作系统ChatGPT源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

DolphinDB 基于 Glibc 升级的性能优化实战案例

在高并发查询、查询需要涉及很多个分区的情况下,低版本的 glibc(低于2.23)会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文,通过 patchelf 工具修改可执行文件和动态库的 rpath,达到无需升级系…

【GEE】基于GEE进行非监督学习

1 简介与摘要 之前写了多季节叠加的监督学习,所以这次简单写一个非监督学习吧。。 这次为了简单明了,就不整那么多虚的了,在这里我不叠图层了,有需要的可以参考前一篇博客自己添加输入的图层。 2 制作输入影像 首先&#xff0c…

“一键搜索,海量商品任你选!多平台聚合,购物更便捷!“

对于多平台聚合搜索,根据关键词取商品列表,您需要使用第三方服务或软件来实现。以下是一些可能的选择: 使用第三方聚合搜索工具:有些第三方工具可以聚合多个电商平台的商品数据,并提供统一的搜索接口。您可以使用这些…

Threejs_04 gui调试开发

threejs的快捷调试工具就是这玩意,那么如何使用呢?? 使用gui调试开发 引入gui实例 //导入lil.gui // import * as dat from "dat.gui"; // 旧 import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";…

Linux搭建服务器环境,挂载SpringBoot+VUE项目

本地环境 Ubuntu20.04 服务器环境 CentOS7.6 购买服务器 以阿里云轻量服务器(适合初学者)为例,自行选择规格进行购买 购买完成后,获取服务器公网IP,同时重置密码,设置服务器密码 配置防火墙 点击实例ID&am…

(八)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (检索 Retrieval)

检索增强生成(RAG)的整体工作流程如下: 在构建检索增强生成 (RAG) 系统时,信息检索是核心环节。检索是指根据用户的问题去向量数据库中搜索与问题相关的文档内容,当我们访问和查询向量数据库时可能会运用到如下几种技术…

mybatisPlus的简单使用

封装实体类 编写Mapper service层 controller层

05_SHELL编程之文本处理工具SED

typora-root-url: pictures课程目标 掌握sed的基本语法结构 熟悉sed常用的命令,如打印p,删除d,插入i等 Windows:​ Linux: vim vi gedit nano emacs 一、sed介绍 1. sed的工作流程 首先sed把当前正在处理的行保存…

非遗拓鱼丨以传统文化助力守护美丽长江

长江生物多样性极为丰富,是中华民族赖以生存的生命之源,值得人类更多的关注与保护。为传播非遗文化、宣传长江生态保护,积极响应野生动物保护宣传的号召,以非遗手工助力守护长江,11月18日,在重庆市陆海国际…

buildadmin+tp8表格操作(6)表格行中添加详情按钮并弹出对话框

在表格行中添加按钮, 是个基本操作 下面来看一下,dialog的 对话框中是怎么拿到数据的 有了这一行, 那么 它的子组件中, 都可以获取到这个对象,所以, 有弹出框的 Info 组件,也可以获取到 我们…