Flask学习(五):session相关流程

流程图如下图所示:

调用相关类如下图所示:

相关代码如下:

from flask import Flask, sessionapp = Flask(__name__)
'''
1. 加密会话数据:在 Flask 中,会话数据存储在客户端的 cookie 中。设置 app.secret_key 可以加密会话 cookie,确保数据的安全性。
2. 签名数据:通过设置 app.secret_key,Flask 可以对客户端发送的数据进行签名,用于验证数据的完整性和来源。
'''
app.secret_key = "1111111"@app.route("/index1")
def index():# 调用session的__setitem__方法# 去ctx中获取session(特殊的字典)session["k1"] = 123return "Index"@app.route("/index2")
def index2():# 调用session的__getitem__方法print(session["k1"])return "Index2"if __name__ == "__main__":app.__call__()app.run()

1、flask实例化之后可以执行的__ call __方法

# self为实例化的app对象
def __call__(self, environ: WSGIEnvironment, start_response: StartResponse
) -> cabc.Iterable[bytes]:# 调用wsgi_app方法return self.wsgi_app(environ, start_response)

2、调用wsgi_app方法:

def wsgi_app(self, environ: WSGIEnvironment, start_response: StartResponse
) -> cabc.Iterable[bytes]:# 调用request_context方法,返回ctx对象'''request_context方法中返回一个类对象,RequestContextctx = RequestContext(self, environ)结合下面的流程最终可以得到ctx中有request(environ),session;将两者打包到一块'''ctx = self.request_context(environ)error: BaseException | None = Nonetry:try:'''对session进行赋值if self.session is None:session_interface = self.app.session_interfaceself.session = session_interface.open_session(self.app, self.request)
​if self.session is None:self.session = session_interface.make_null_session(self.app)'''ctx.push()'''执行视图函数'''response = self.full_dispatch_request()except Exception as e:error = eresponse = self.handle_exception(e)except:  # noqa: B001error = sys.exc_info()[1]raisereturn response(environ, start_response)finally:if "werkzeug.debug.preserve_context" in environ:environ["werkzeug.debug.preserve_context"](_cv_app.get())environ["werkzeug.debug.preserve_context"](_cv_request.get())
​if error is not None and self.should_ignore_error(error):error = None
​ctx.pop(error)

2.1、request_context方法源码如下:

def request_context(self, environ: WSGIEnvironment) -> RequestContext:# 返回RequestContext对象 self 表示实例化的Flask对象app,environ表示wsgi环境return RequestContext(self, environ)

2.1.1、RequestContext类中进行的操作:

def __init__(self,app: Flask,environ: WSGIEnvironment,request: Request | None = None,session: SessionMixin | None = None,
) -> None:self.app = app'''判断如果request是空的话,将其赋值为app.request_class(environ)即: request_class: type[Request] = Requestrequest=Request'''if request is None:request = app.request_class(environ)request.json_module = app.jsonself.request: Request = requestself.url_adapter = Nonetry:self.url_adapter = app.create_url_adapter(self.request)except HTTPException as e:self.request.routing_exception = eself.flashes: list[tuple[str, str]] | None = None'''设置session值'''self.session: SessionMixin | None = session
​self._after_request_functions: list[ft.AfterRequestCallable[t.Any]] = []......

2.2、调用push方法,对session进行赋值:

def push(self) -> None:app_ctx = _cv_app.get(None)
​if app_ctx is None or app_ctx.app is not self.app:app_ctx = self.app.app_context()app_ctx.push()else:app_ctx = None
​self._cv_tokens.append((_cv_request.set(self), app_ctx))
​'''对session进行赋值'''if self.session is None:# session_interface: SessionInterface = SecureCookieSessionInterface()session_interface = self.app.session_interface# SecureCookieSessionInterface.open_session(self.app, self.request)self.session = session_interface.open_session(self.app, self.request)
​if self.session is None:self.session = session_interface.make_null_session(self.app)
​if self.url_adapter is not None:self.match_request()

2.2.1、SecureCookieSessionInterface.open_session(self.app, self.request)方法:由此所知,session是一个特殊的字典。

def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None:s = self.get_signing_serializer(app)if s is None:return None'''如果拿不到值就返回session_class()session_class() :class SecureCookieSession(CallbackDict, SessionMixin)继承class CallbackDict(UpdateDictMixin, dict):CallbackDict继承dict(字典)'''val = request.cookies.get(self.get_cookie_name(app))if not val:return self.session_class()max_age = int(app.permanent_session_lifetime.total_seconds())try:data = s.loads(val, max_age=max_age)return self.session_class(data)except BadSignature:return self.session_class()

初步学习,继续补充完善......

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

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

相关文章

OLED模块

OLED模块 综述:本篇文章简要讲述了oled的定义,两种oled的引脚和接线情况、iic通讯协议、spi通讯协议、OLED代码引用和注意事项。 1.定义 OLED(Organic Light-Emitting Diode)模块是一种使用有机发光二极管作为显示元素的显示模…

【强化学习概念01】什么是 Q-Learning:了解 Q-Learning 的最佳指南

​ 一、说明 强化训练如同训狗。当狗或孩子行为不端时,你会怎么做?你责骂他们以确保他们不会重复或学习不良行为。另一方面,如果他们做了好事,你就会奖励他们,灌输良好的行为。不管你相信与否,这种正强化或负强化系统也可用于训练机器。它被称为强化学习,它可以帮助我…

DFS:二叉树的深搜与回溯

一、计算布尔二叉树的值 . - 力扣(LeetCode) class Solution { public:bool evaluateTree(TreeNode* root) {if(root->leftnullptr) return root->val0?false:true; bool left evaluateTree(root->left);bool rightevaluateTree(root->rig…

1.1 单片机的概念

一,单片机的概念 单片机(Single-Chip Microcomputer),也被称为单片微控制器,是一种集成电路芯片。它采用超大规模集成电路技术,将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、…

Ubuntu20.04彻底删除mysql,并重装mysql

彻底卸载 sudo apt purge mysql-* sudo rm -rf /etc/mysql/ /var/lib/mysql sudo apt autoremove sudo apt autocleanapt-get purge 与 apt-get remove是不同的,简单来说: purge可以将包以及软件的配置文件全部删除 remove仅可以删除包,但不…

springcloud基本使用(搭建eureka服务端)

创建springbootmaven项目 next next finish创建成功 删除项目下所有文件目录&#xff0c;只保留pox.xml文件 父项目中的依赖&#xff1a; springboot依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s…

类模板与友元

掌握类模板配合友元函数的类内实现和类外实现。 全局函数类内实现&#xff1a;直接在类内声明友元函数即可&#xff08;推荐使用这种&#xff09; #include <iostream> #include <Windows.h> #include <string>using namespace std;template<typename T…

大模型提示工程之Prompt框架和示例

今天和大家分享一下&#xff1a;大模型提示工程之Prompt框架和示例&#xff1a; TAG框架 任务&#xff08;Task&#xff09;: 开发一个新的手机应用&#xff0c;旨在帮助用户更好地管理他们的日常健康。 行动&#xff08;Action&#xff09;: 进行市场调研&#xff0c;设计用户…

[Godot] 3D拾取

CollisionObject3D文档 Camera3D文档 CollisionObject3D有个信号_input_event&#xff0c;可以用于处理3D拾取。 Camera3D也有project_position用于将屏幕空间坐标投影到3D空间。 extends Node3D#是否处于选中状态 var selected : bool false #摄像机的前向量 var front : V…

Swift:“逻辑运算子“与“比较运算符“

1. 逻辑非 ! 逻辑非运算符 ! 是用于对布尔值取反的。当操作数为 true 时&#xff0c;! 将返回 false&#xff0c;而当操作数为 false 时&#xff0c;! 将返回 true。 let isTrue true let isFalse !isTrue // isFalse 现在是 false 2. 逻辑与 && 逻辑与运算符 &a…

爬取b站音频和视频数据,未合成一个视频

一、首先找到含有音频和视频的url地址 打开一个视频&#xff0c;刷新后&#xff0c;找到这个包&#xff0c;里面有我们所需要的数据 访问这个数据包后&#xff0c;获取字符串数据&#xff0c;用正则提取&#xff0c;再转为json字符串方便提取。 二、获得标题和音频数据后&…

linux基础命令篇:Linux基础命令讲解——文件浏览(cat、less、head、tail和grep)

Linux基础命令讲解——文件浏览&#xff08;cat、less、head、tail和grep&#xff09; 本文详细介绍Linux中的cat、less、head、tail和grep命令&#xff0c;这些命令在日常工作中非常实用&#xff0c;以下是关于这些命令的详细介绍&#xff1a; 1. cat命令&#xff1a;用于查看…

JUC:synchronized优化——锁的升级过程(偏向锁->轻量级锁->重量级锁)以及内部实现原理

文章目录 锁的类型轻量级锁重量级锁自旋优化偏向锁偏向锁的细节偏向锁的撤销批量重偏向批量撤销锁消除 锁的类型 重量级锁、轻量级锁、偏向锁。 加锁过程&#xff1a;偏向->轻量级->重量级 轻量级锁 轻量级锁的使用场景&#xff1a;如果一个对象虽然有多线程要加锁&am…

rust - 使用serde_yaml读取配置文件

本文提供了一种读取yaml配置文件&#xff0c;转换为结构体的方法。 安装依赖 cargo add serde cargo add serde_json cargo add serde_yaml cargo add schemars配置文件示例 test:debug: true设置需要转换的结构体 需要定义Default trait&#xff0c;用于配置文件不存在的情…

登录者个人信息查询

目录 &#x1f95e;1.vo层描述 &#x1f37f;2..vo层创建 &#x1f32d;3.编写controller层 &#x1f953;4.service层 &#x1f9c2;5.测试 1.vo层描述 Spring Boot项目中的实体类通常用于映射数据库表&#xff0c;包含了业务对象的所有属性。然而&#xff0c;前端或其…

Jenkins详细安装配置部署

目录 简介一、安装jdk二、安装jenkins这里如果熟悉 Jenkins &#xff0c;可以【选择插件来安装】&#xff0c;如果不熟悉&#xff0c;还是按照推荐来吧。注意&#xff1a; 三、插件安装如果上面插件安装&#xff0c;选择的不是【安装推荐的插件】&#xff0c;而是【选择插件来安…

ZYNQ学习之PetaLinux与Vitis的安装

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Petalinux安装 1.1、Petalinux资源下载 百度云安装包&#xff1a; Petalinux 安装…

FFMPEG C++封装(一)(C++ FFMPEG)

1 概述 FFMPEG是一个C语言开源视音频编解码库。本文将FFMPG4.1.3进行C封装&#xff0c;形成C FFMPG库。 2 架构 架构图如下所示&#xff1a; 架构说明: Init 初始化FFMPEG库。IStream 输入流&#xff0c;FFMPEG的输入音视频文件。Packet 音视频数据包Decoder 音视频编码器F…

C语言运算符和表达式——强制类型转换

目录 自动类型转换 强制类型转换运算符——类型强转&#xff08;Casting&#xff09; 问题的提出 Example: int total, number; float aver; …… 整数除法&#xff1a; aver total / number; total:15 →15/2 …

R语言数据分析基础(三)

在R语言中&#xff0c;数据类型主要包括以下几种&#xff1a; 数值型&#xff08;Numeric&#xff09;: 数值型数据包括整数&#xff08;integer&#xff09;和双精度数&#xff08;double&#xff09;。整数是没有小数部分的数字&#xff0c;而双精度数可以有小数部分。在R中&…