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

流程图如下图所示:

调用相关类如下图所示:

相关代码如下:

from flask import Flask, session

app = 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"] = 123
    return "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方法中返回一个类对象,RequestContext
        ctx = RequestContext(self, environ)
        结合下面的流程最终可以得到ctx中有request(environ),session;将两者打包到一块
    '''
    ctx = self.request_context(environ)
    error: BaseException | None = None
    try:
        try:
            '''
            对session进行赋值
            if self.session is None:
            session_interface = self.app.session_interface
            self.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 = e
            response = self.handle_exception(e)
        except:  # noqa: B001
            error = sys.exc_info()[1]
            raise
        return 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] = Request
      request=Request
    '''
    if request is None:
        request = app.request_class(environ)
        request.json_module = app.json
    self.request: Request = request
    self.url_adapter = None
    try:
        self.url_adapter = app.create_url_adapter(self.request)
    except HTTPException as e:
        self.request.routing_exception = e
    self.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()

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

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

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

相关文章

Java毕业设计-基于springboot开发的HTML问卷调查系统设计与实现-毕业论文(附毕设源代码)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块的实现1.1 问卷列表1.2 新闻资讯信息管理1.3 新闻资讯类型管理 四、毕设内容和源代码获取总结 Java毕业设计-基于…

应用方案D78040场扫描电路,偏转电流可达1.7Ap-p,可用于中小型显示器

D78040是一款场扫描电路,偏转电流可达1.7Ap-p,可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下:

springdoc-openapi-用户界面如何将请求设置为HTTPS

一、问题描述 当我们的服务接口需要通过HTTPS访问时,通过swagger可视化页面请求接口的时候,发起的是HTTP请求,导致请求无法到达后端,影响测试。 二、解决方法 1、将服务的地址添加到配置文件中 swagger:server-list: #本地环境…

【Vue3源码学习】— CH2.8 Vue 3 响应式系统小结

Vue 3 响应式系统小结 1.核心概念1.1 Proxy和Reflect1.2 响应式API1.3 依赖收集与更新触发1.4 触发更新(Triggering Updates):1.5 副作用函数(Effect)1.6 计算属性和观察者1.7 EffectScope1.8 性能优化: 2.…

数据库-root密码丢失的重置方案(win11环境)

当在windows系统中安装的mysql由于操作不当,或者密码遗忘,今天测试了一下,可以用以下方法重置root的密码。 mysqlwindows环境root密码重置问题 在win10/11环境下mysql8密码遗忘后的重置密码方案。 停止mysql服务 查找windows中的mysql服务名称…

软考高级架构师:性能评价方法概念和例题

一、AI 讲解 性能评价是衡量计算机系统或其组件在指定条件下执行预期任务的有效性的一种方式。性能评价的方法主要可以分为几种,每种方法都有其特点和适用场景。 性能评价方法 方法描述时钟频率法通过计算机的时钟频率来评估性能,时钟频率越高&#x…

morkdown语法转微信公众号排版(免费)

morkdown语法转微信公众号排版(免费) 源码来自githab,有些简单的问题我都修复了。大家可以直接去找原作者的源码,如果githab打不开就从我下载的网盘里下载吧。 效果

LeetCode 热题 100 | 动态规划(一)

目录 1 70. 爬楼梯 1.1 基本思路 1.2 官方题解 2 118. 杨辉三角 3 198. 打家劫舍 菜鸟做题,语言是 C 1 70. 爬楼梯 核心思想:把总问题拆解为若干子问题。 总问题:上到 5 楼的方式有多少种子问题:上到 4 楼的方式有多…

焦虑研究的实验设备——大小鼠高架十字迷宫KT-0856

高架十字迷宫是一种广泛应用于焦虑研究的实验设备,尤其适用于啮齿类动物如大鼠和小鼠。这种迷宫的设计基于啮齿类动物的自然探究行为,以及它们对于高悬敞开环境的恐惧。通过观察和量化动物在开臂和闭臂之间的行为选择,研究人员可以评估其焦虑…

逻辑回归(Logistic Regression)详解

逻辑回归(Logistic Regression)是一种常用的统计学习方法,用于解决二分类问题。虽然名字中包含“回归”,但逻辑回归实际上是一种分类算法,而不是回归算法。它的基本原理是使用逻辑函数(也称为Sigmoid函数&a…

mysyl索引

图中一共分了三个部分: Index Key :MySQL是用来确定扫描的数据范围,实际就是可以利用到的MySQL索引部分,体现在Key Length。 Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后&#xff…

6、Cocos Creator 2D 渲染组件:​Sprite 组件​

Sprite 组件 Sprite(精灵)是 2D/3D 游戏最常见的显示图像的方式,在节点上添加 Sprite 组件,就可以在场景中显示项目资源中的图片。 属性功能说明Type渲染模式,包括普通(Simple)、九宫格&#x…

[C++]使用OpenCV去除面积较小的连通域

这是后期补充的部分&#xff0c;和前期的代码不太一样 效果图 源代码 //测试 void CCutImageVS2013Dlg::OnBnClickedTestButton1() {vector<vector<Point> > contours; //轮廓数组vector<Point2d> centers; //轮廓质心坐标 vector<vector<Point&…

深度学习理论基础(五)卷积神经网络CNN

目录 前述&#xff1a;卷积神经网络基础1.卷积网络流程2.卷积网络核心3.卷积下采样4.卷积上采样--转置卷积 一、卷积神经网络层1.卷积层&#xff08;1&#xff09;内部参数&#xff1a;卷积核权重&#xff08;2&#xff09;内部参数&#xff1a;偏置&#xff08;3&#xff09;外…

网络安全 | 什么是DDoS攻击?

关注WX&#xff1a;CodingTechWork DDoS-介绍 DoS&#xff1a;Denial of Service&#xff0c;拒绝服务。DDoS是通过大规模的网络流量使得正常流量不能访问受害者目标&#xff0c;是一种压垮性的网络攻击&#xff0c;而不是一种入侵手段。NTP网络时间协议&#xff0c;设备需要…

Kaggle:收入分类

先看一下数据的统计信息 import pandas as pd # 加载数据&#xff08;保留原路径&#xff0c;但在实际应用中建议使用相对路径或环境变量&#xff09; data pd.read_csv(r"C:\Users\11794\Desktop\收入分类\training.csv", encodingutf-8, encoding_errorsrepl…

HTML - 请你谈一谈img标签图片和background背景图片的区别

难度级别&#xff1a;中级及以上 提问概率&#xff1a;65% 面试官当然不会问如何使用img标签或者background来加载一张图片&#xff0c;这些知识点都很基础&#xff0c;相信只要从事前端开发一小段时间以后&#xff0c;就可以轻松搞定加载图片…

MFC通用静态库制作与使用

开发环境VS2013 1、新建工程&#xff0c;选择Win32 Project&#xff0c;命名&#xff0c;选择路径等 2、选择Static library &#xff0c;勾选MFC 3、点击完成。在工程中添加相应的头文件、源文件等通用功能函数或者类。 4、在其他工程引入使用。在使用的工程项目设置中Linker…

HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问

场景介绍 典型跨应用访问数据的用户场景下&#xff0c;数据提供方会存在多次被拉起的情况。 为了降低数据提供方拉起次数&#xff0c;提高访问速度&#xff0c;OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式&#xff0c;即静默数据访问。 静默数据访问通过数据…

基于Python+Tkinter实现一个贪食蛇小游戏

你是否还记得那个时代&#xff0c;当我们的手机还没有触摸屏&#xff0c;游戏也只有像“贪食蛇”这样的经典款&#xff1f;当时&#xff0c;许多人都沉迷于控制一条小蛇吃食物的乐趣中。而今&#xff0c;让我们利用Python和Tkinter&#xff0c;一起重温那个时代&#xff0c;制作…