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.hqwc.cn/news/570739.html

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

相关文章

Qt Design Studio各个组件怎么用?【长期更新】

写在前面:本文长期更新,建议点赞/收藏/关注~ 在Qt Design Studio中,组件类别有: 每一种,都有其特定的用途和适用场景: 1.My Components 使用时机:当你需要重用自定义的设计元素或者特殊功能…

强化学习及其在机器人任务规划中的进展与分析

源自:模式识别与人工智能 作者:张晓明 高士杰 姚昌瑀 褚誉 彭硕 “人工智能技术与咨询” 发布 摘 要 强化学习可以让机器人通过与环境的交互,学习最优的行动策略,是目前机器人领域关注的重要前沿方向之一.文中简述机器人任务规划问题的形式化建…

Fragment 与 ViewPager的联合应用(2)

5.创建底部布局bottom_layout <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"horizontal"android:layout_width"match_parent"android:layout_height"55dp"android:background&qu…

反射率光纤光谱仪检测汽车后视镜反射率

反射率光纤光谱仪是一种用于测量材料表面反射率的精密仪器&#xff0c;它通过光纤传输光信号&#xff0c;并利用光谱仪进行分析&#xff0c;以确定材料的光学特性。反射率光纤光谱仪的工作原理基于相对反射率的计算&#xff0c;它涉及到光源、光纤、光谱仪等关键组件。 后视镜能…

在项目中缓存如何优化?SpringCache接口返回值的缓存【CachePut、CacheEvict、Cacheable】

SpringCache 介绍&#xff08;不同的缓存技术有不同的CacheManager&#xff09;注解入门程序环境准备数据库准备环境准备注入CacheManager引导类上加EnableCaching CachePut注解(缓存方法返回值)1). 在save方法上加注解CachePut2). 测试 CacheEvict注解&#xff08;清理指定缓存…

智慧农业领航:数字乡村助力乡村振兴与可持续发展

目录 一、引言 二、智慧农业的内涵与特点 三、数字乡村助力乡村振兴的路径 1、提升农业生产效率 2、优化农业产业结构 3、促进乡村社会治理现代化 三、智慧农业在可持续发展中的作用 1、促进资源节约与环境保护 2、提升农产品质量与食品安全 3、推动乡村经济多元化发…

2024.3.26学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p273-p285 包 包的本质实际上就是创建不同的文件夹/目录来保存类文件 包的三大作用 区分相同名字的类 当类很多时&#xff0c;可以很好的管理类 控制访问范围 包的基本语法 package com.xx…

解决错误LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to

react native pod第三方包或者git clone的时候遇到 OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443两种解决方案 方法一 修改计算机网络配置 由于使用 IPv6 的原因&#xff0c;可能会导致这一问题的出现 系统在解析hostname时使用了ipv6 可以配…

在vue中使用echarts饼图示例

1.安装 npm install echarts --save 2.官方示例 option {title: {text: Referer of a Website,subtext: Fake Data,left: center},tooltip: {trigger: item},legend: {orient: vertical,left: left},series: [{name: Access From,type: pie,radius: 50%,data: [{ value: 104…

springboot企业级抽奖项目业务四(缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…

pytorch反向传播算法

目录 1. 链式法则复习2. 多输出感知机3. 多层感知机4. 多层感知机梯度推导5. 反向传播的总结 1. 链式法则复习 2. 多输出感知机 3. 多层感知机 如图&#xff1a; 4. 多层感知机梯度推导 简化式子把( O k O_k Ok​ - t k t_k tk​) O k O_k Ok​(1 - O k O_k Ok​)起个别名…

国产数据库中统计信息自动更新机制

数据库中统计信息描述的数据库中表和索引的大小数以及数据分布状况&#xff0c;统计信息的准确性对优化器选择执行计划时具有重要的参考意义。本文简要整理了下传统数据库和国产数据库中统计信息的自动更新机制&#xff0c;以加深了解。 1、数据库统计信息介绍 优化器是数据库…