Flask-Session使用Redis

Flask-Session使用Redis

一、介绍

  • 在Flask中,session数据默认是以加密的cookie形式存储在用户的浏览器中的。
  • 但是,真正的session数据应该存储在服务器端。
  • Django框架会将session数据存储在数据库的djangosession表中,而Flask则可以通过第三方库如flask-session来实现,通常将session存储在Redis这样的内存数据库中。
  • 此外,Flask也可以使用JWT(JSON Web Tokens)来处理session。

二、使用

1. 安装

  • 要使用Flask的session功能,首先需要安装flask-session库:

    pip install flask-session
    

2.方式一

  • 创建Redis连接,并使用RedisSessionInterface来将session数据存储到Redis中。

  • 通过session字典来存储和获取数据。

  • 示例

    • from flask import Flask, session
      from flask_session.redis import RedisSessionInterface
      from redis import Redis
      
      app = Flask(__name__)  # 创建一个 Flask 应用对象
      app.debug = True  # 设置调试模式为开启
      app.config['SESSION_COOKIE_NAME'] = 'hello_session'  # 设置会话 cookie 名称,前端显示
      conn_redis = Redis(host="localhost", port=6379)  # 创建一个 Redis 连接对象,连接本地 Redis 服务器
      
      # 设置应用的会话接口为基于 Redis 的会话
      # app :Flask 应用对象
      # client :Redis 客户端对象
      # key_prefix :用于在数据库中存储会话的键名前缀
      app.session_interface = RedisSessionInterface(app, client=conn_redis, key_prefix='bruce')
      
      
      @app.route('/')
      def index():  # 定义路由处理函数
       session['serret'] = '123456'  # 设置会话变量 'serret'
       return 'index'  # 返回字符串 'index'
      
      
      if __name__ == '__main__':
       app.run()
      

3.方式二

  • 设置session的cookie名称和配置,指定session类型为redis。

  • 创建Redis连接对象,并使用Session类来初始化Flask应用。

  • 示例

    • from flask import Flask, session
      from flask_session import Session
      from redis import Redis
      
      app = Flask(__name__)
      app.session_cookie_name = 'hello_session'
      
      # 配置会话类型为redis,并指定redis的主机和端口
      app.config['SESSION_TYPE'] = 'redis'
      app.config['SESSION_REDIS'] = Redis(host='127.0.0.1', port=6379)
      
      # 将会话配置应用到Flask应用程序中
      Session(app)
      
      @app.route('/')
      def index():
       session['secret'] = '123456'
       return 'index'
      
      if __name__ == '__main__':
       app.run()
      
      
      

4.相关配置

# 设置会话的cookie名称
app.session_cookie_name = 'hello_session'

# 配置会话类型为redis
app.config['SESSION_TYPE'] = 'redis'

# Redis配置
app.config['SESSION_REDIS'] = Redis(host='127.0.0.1', port=6379)
# Redis服务器的密码(如果有)
app.config['SESSION_REDIS_PASSWORD'] = 'password'  
# Redis数据库索引
app.config['SESSION_REDIS_DB'] = 0 

# 会话的过期时间,默认是31天
app.config['PERMANENT_SESSION_LIFETIME'] = 3600 * 24 * 31

# 是否对发送到浏览器端的cookie进行签名
app.config['SESSION_USE_SIGNER'] = True

# 是否需要HTTPS传输cookie
app.config['SESSION_COOKIE_SECURE'] = False

# 设置cookie的httponly属性,防止客户端脚本访问cookie
app.config['SESSION_COOKIE_HTTPONLY'] = True

# 设置cookie的SameSite属性,防止CSRF攻击
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'

三、源码解析

  • 使用Redis时,使用的是RedisSessionInterface

  • RedisSessionInterface继承ServerSideSessionInterface

  • open_session

    • def open_session(self, app, request):
       # 从cookie中获取会话ID
       sid = request.cookies.get(app.config["SESSION_COOKIE_NAME"])
      
       # 如果没有会话ID,生成一个新的,并返回
       if not sid:
           sid = self._generate_sid(self.sid_length)
           return self.session_class(sid=sid, permanent=self.permanent)
      
       # 如果会话ID已经签名,解除签名
       if self.use_signer:
           try:
               sid = self._unsign(app, sid)
           except BadSignature:
               sid = self._generate_sid(self.sid_length)
               return self.session_class(sid=sid, permanent=self.permanent)
      
       # 从数据库中检索会话数据
       store_id = self._get_store_id(sid)
       saved_session_data = self._retrieve_session_data(store_id)
      
       # 如果已保存会话存在,从文档中加载会话数据
       if saved_session_data is not None:
           return self.session_class(saved_session_data, sid=sid)
      
       # 如果已保存会话不存在,创建一个新会话
       sid = self._generate_sid(self.sid_length)
       return self.session_class(sid=sid, permanent=self.permanent)
      
  • save_session

    • def save_session(self, app, session, response):
       domain = self.get_cookie_domain(app)  # 获取cookie的域
       path = self.get_cookie_path(app)  # 获取cookie的路径
       name = self.get_cookie_name(app)  # 获取cookie的名称
      
       store_id = self._get_store_id(session.sid)  # 获取存储ID
      
       if session.accessed:  # 如果会话已访问
           response.vary.add("Cookie")  # 响应头中添加Vary信息
      
       if not session:  # 如果会话不存在
           if session.modified:  # 如果会话已修改
               self._delete_session(store_id)  # 删除会话
               response.delete_cookie(key=name, domain=domain, path=path)  # 从响应中删除cookie
               response.vary.add("Cookie")  # 响应头中添加Vary信息
           return  # 返回
      
       if not self.should_set_storage(app, session):  # 如果不应该设置存储
           return  # 返回
      
       self._upsert_session(app.permanent_session_lifetime, session, store_id)  # 更新或插入会话
      
       if not self.should_set_cookie(app, session):  # 如果不应该设置cookie
           return  # 返回
      
       # 获取额外的所需cookie设置
       value = self._sign(app, session.sid) if self.use_signer else session.sid  # 获取cookie的值
       expires = self.get_expiration_time(app, session)  # 获取cookie的过期时间
       httponly = self.get_cookie_httponly(app)  # 获取cookie的httponly设置
       secure = self.get_cookie_secure(app)  # 获取cookie的安全设置
       samesite = (
           self.get_cookie_samesite(app) if self.has_same_site_capability else None
       )  # 获取相同站点设置(如果支持)
      
       response.set_cookie(
           key=name,
           value=value,
           expires=expires,
           httponly=httponly,
           domain=domain,
           path=path,
           secure=secure,
           samesite=samesite,
       )  # 在响应中设置cookie
       response.vary.add("Cookie")  # 响应头中添加Vary信息
      

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

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

相关文章

12款超良心好用APP推荐,每一款都值得下载!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/分享是奉献的果实,分享是快乐的前提。每天给小伙伴们分享自己认可的软件,也是莫大的幸福,今天获得12款好用的软…

扁鹊三兄弟的启示,保证系统稳定的秘诀

一、稳定性的重要性 1. 公司收益的角度 从公司收益的视角审视,系统不稳定可能会引发直接损失。例如,当系统突然出现故障导致交易中断时,可能造成交易款项的紊乱、资金的滞留或损失,这不但会阻碍当前交易的顺利完成,还…

ASP.NET MVC-razor编写-2-svg中使用js+添加事件监听

环境:win10 效果 初始状态: 鼠标移入某个text(比如KS primer)时,text和连接的线条与箭头都变色: 鼠标移出时回复正常。 如果是移入另一种红色的text(比如Cell Sceening Tag)&…

Using a text embedding model locally with semantic kernel

题意:在本地使用带有语义核(Semantic Kernel)的文本嵌入模型 问题背景: Ive been reading Stephen Toubs blog post about building a simple console-based .NET chat application from the ground up with semantic-kernel. Im…

HexPlane: A Fast Representation for Dynamic Scenes一种动态场景的快速表示方法

Abstract 动态三维场景的建模与再现是三维视觉领域的一个具有挑战性的课题。先前的方法基于 NERF 并依赖于隐式表示这是缓慢的,因为它需要许多 MLP 评估,限制真实世界的应用程序。我们展示了动态三维场景可以明确地表示为六个平面的学习功能&#xff0c…

【重磅】万能模型-直接能换迪丽热巴的模型

万能模型,顾名思义,不用重新训练src,直接可以用的模型,适应大部分原视频脸 模型用法和正常模型一样,但可以跳过训练阶段!直接到合成阶段使用该模型 本模型没有做Xseg,对遮挡过多的画面不会自动适…

信创-系统架构师认证

随着国家对信息技术自主创新的战略重视程度不断提升,信创产业迎来前所未有的发展机遇。未来几年内,信创产业将呈现市场规模扩大、技术创新加速、产业链完善和国产化替代加速的趋势。信创人才培养对于推动产业发展具有重要意义。应加强高校教育、建立人才…

2.4章节python中字符串类型

在Python中,字符串(String)是一种基本的数据类型,用于表示文本信息。字符串可以包含字母、数字、标点符号或任何Unicode字符。Python中的字符串是不可变的,这意味着一旦创建了字符串,就不能更改字符串中的字…

2007年下半年软件设计师【上午题】试题及答案

文章目录 2007年下半年软件设计师上午题--试题2007年下半年软件设计师上午题--答案2007年下半年软件设计师上午题–试题

YOLOV++ 详解 | 网络结构、代码解析、YOLOV 论文阅读、初识 VID

前言 代码地址:https://github.com/YuHengsss/YOLOV 本文网络结构按 YOLOV SwinTiny 绘制,不同的模型主要差异在于 Backbone,VID 相关的部分基本相同。 Predict Input 代码基于 vid_demo。首先会读取视频中的所有帧(只能用短视频…

亚马逊跟卖ERP的自动调价功能,能够简易地批量设置价格规则。

跟卖的智能调价 跟卖智能调价简单说是可以上调,下调就是怎么说?上调就是它根靠根据市场最低的价格情况进行去上调。 然后添加指定条件,到工具栏找到指定条件,点击添加指定条件。 然后选择店铺,比如选择店铺&#xf…

p-tuning算法介绍及其pytorch代码实现

P-tuning介绍 代码实现 import torch from transformers import BertTokenizer, BertForSequenceClassification import matplotlib.pyplot as plt import matplotlib.ticker as tickertokenizer BertTokenizer.from_pretrained(bert-base-chinese) model BertForSequenceCl…

Games101学习笔记 Lecture 15: Ray Tracing 3 (Light Transport Global Illumination)

Lecture 15: Ray Tracing 3 (Light Transport & Global Illumination 一、BRDF 双向反射分布函数定义 二、反射方程 Reflection Equation三、渲染方程1.重写反射方程2.当其他的点反射的radiance作为入射 一、BRDF 双向反射分布函数 定义 计算不同的反射方向上会分布多少能…

竹云实力入选《现代企业零信任网络建设应用指南报告》代表性厂商

2024年7月3日,国内网络安全媒体安全牛正式发布《现代企业零信任网络建设应用指南报告(2024版)》。竹云凭借在零信任领域创新性的产品方案和优异的市场表现,实力入选代表性厂商。 伴随着云计算、AI、大数据等技术的发展,远程办公、业务协同、…

遗漏知识点

什么是RAII? RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C语言的一种管理资源、避免泄漏的惯用法。利用的就是C构造的对象最终会被销毁的原则。RAII的做法是使用一个对象&am…

西门子PLC1200--与电脑S7通讯

硬件构成 PLC为西门子1211DCDCDC 电脑上位机用PYTHON编写 二者通讯用网线,通讯协议用S7 PLC上的数据 PLC上的数据是2个uint,在DB1,地址偏移分别是0和2 需要注意的是DB块要关闭优化的块访问,否则是没有偏移地址的 PLC中的数据内…

VCS+Vivado联合仿真BUG

场景: 在vcsvivado联合仿真过程中,对vivado导出的shell脚本修改,修改某些source文件路径,vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下: 修改仅为注释掉某一行,下面变为source文件新…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【20】认证服务04—SSO单点登录

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【20】认证服务04—SSO单点登录 xxl-sso多系统-单点登录单点登录流程原理图单点登录流程简单实现参考 xxl-sso https://gitee.com/xuxueli0323/xxl-sso xxl-sso是开源的一个单点登录框架 …

交换机基本原理

文章目录 前言一、交换机的转发行为二、交换机的转发原理1.MAC地址表2.交换机初始状态3.学习MAC地址4.ARP协议5.交换机转发数据帧6.目标主机回复 三、华为交换机基本命令1.VRP视图分层2.命令行补全3.命令行帮助4.配置设备名称5.命令等级6.用户界面7.配置console认证8.配置用户界…

Ubuntu系统复制文件到共享文件夹出错

1、问题描述 Ubuntu系统复制文件到共享文件夹时,出现拼接文件时出错:输入/输出错误。 使用cp命令: cp -Rf XXX YYY 也是出错: cp: 写入 xxx 出错: 输入/输出错误 2、查看磁盘空间 查看磁盘空间,显示空间还有剩余…