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 Redisapp = 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 Redisapp = 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中获取会话IDsid = 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) # 获取存储IDif 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) # 从响应中删除cookieresponse.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): # 如果不应该设置cookiereturn # 返回# 获取额外的所需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,) # 在响应中设置cookieresponse.vary.add("Cookie") # 响应头中添加Vary信息
-
相关文章:
Flask-Session使用Redis
Flask-Session使用Redis 一、介绍 在Flask中,session数据默认是以加密的cookie形式存储在用户的浏览器中的。但是,真正的session数据应该存储在服务器端。Django框架会将session数据存储在数据库的djangosession表中,而Flask则可以通过第三…...
Redis缓存管理机制
在当今快节奏的数字世界中,性能优化对于提供无缝的用户体验至关重要。缓存在提高应用程序性能方面发挥着至关重要的作用,它通过将经常使用或处理的数据存储在临时高速存储中来减少数据库负载并缩短响应时间,从而减少系统的延迟。Redis 是一种…...
初学嵌入式是弄linux还是单片机?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!1、先入门了51先学了89c52…...
【基础算法总结】分治—快排
分治—快排 1.分治2.颜色分类3.排序数组4.数组中的第K个最大元素5.库存管理 III 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.分治 分治…...
[C++]——同步异步日志系统(1)
同步异步日志系统 一、项⽬介绍二、开发环境三、核心技术四、环境搭建五、日志系统介绍5.1 为什么需要日志系统5.2 日志系统技术实现5.2.1 同步写日志5.2.2 异步写日志 日志系统: 日志:程序在运行过程中,用来记录程序运行状态信息。 作用&…...
python 第6册 辅助excel 002 批量创建非空白的 Excel 文件
---用教授的方式学习 此案例主要通过使用 while 循环以及 openpyxl. load_workbook()方法和 Workbook 的 save()方法,从而实现在当前目录中根据已经存在的Excel 文件批量创建多个非空白的Excel 文件。当运行此案例的Python 代码(A002.py 文件࿰…...
力扣61. 旋转链表(java)
思路:用快慢指针找到最后链表k个需要移动的节点,然后中间断开节点,原尾节点连接原头节点,返回新的节点即可; 但因为k可能比节点数大,所以需要先统计节点个数,再取模,看看k到底需要移…...
智慧园区综合平台解决方案PPT(75页)
## 智慧园区的理解 ### 从园区1.0到园区4.0的演进 1. 园区1.0:以土地经营为主,成本驱动,提供基本服务。 2. 园区2.0:服务驱动,关注企业成长,提供增值服务。 3. 园区3.0:智慧型园区ÿ…...
Python只读取Excel文件的一部分数据,比如特定范围的行和列?
如何只读取Excel文件的一部分数据,比如特定范围的行和列? 在Python中,如果你只想读取Excel文件的特定范围,可以使用以下方法: pandas: Pandas是一个强大的数据处理库,它有一个内置函数read_excel()用于读…...
快速入门FreeRTOS心得(正点原子学习版)
对于FreeROTS,我第一反应想到的就是通信里的TDM(时分多址)。不同任务给予分配不同的时间间隔,也就是任务之间在每个timeslot都在来回切换。 这里有重要的一点,就是中断要短小,优先级是自高到底进行打断。 …...
【博主推荐】HTML5实现简洁好看的个人简历网页模板源码
文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 工作经验界面1.4 学习教育界面1.5 个人技能界面1.6 专业特长界面1.7 朋友评价界面1.8 获奖情况界面1.9 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,…...
Android应用安装过程
Android 系统源码源码-应用安装过程 Android 中应用安装的过程就是解析 AndroidManifest.xml 的过程,系统可以从 Manifest 中得到应用程序的相关信息,比如 Activity、Service、Broadcast Receiver 和 ContentProvider 等。这些工作都是由 PackageManage…...
Word中输入文字时,后面的文字消失
当在Word中输入文字时,如果发现后面的文字消失,通常是由以下3个原因造成的: 检查Insert键状态:首先确认是否误按了Insert键。如果是,请再次按下Insert键以切换回插入模式。在插入模式下,新输入的文字会插入…...
【LeetCode】合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 水题,主要用于后面的链表的归并排序做了该题 AC代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nex…...
分子AI预测赛Task1笔记
分子AI预测赛Task1笔记 实践步骤:跑通baseline → 尝试个人idea→尝试进阶baseline 一、跑通baseline 1、应当先下载数据库 下载相应的数据库 !pip install lightgbm openpyxl2、训练模型并预测结果 首先要导入相应的库和方法类,如pandas等 # 1. …...
ubuntu 安装并启用 samba
环境:ubuntu server 24.04 步骤如下: sudo apt update sudo apt install samba修改配置文件: sudo vi /etc/samba/smb.conf新增内容: [username]path /home/[username]available yesvalid users [username]read only nobrow…...
atcoder ABC 357-D题详解
atcoder ABC 357-D题详解 Problem Statement For a positive integer N, let VN be the integer formed by concatenating N exactly N times. More precisely, consider N as a string, concatenate N copies of it, and treat the result as an integer to get VN. For…...
从单一到多元:EasyCVR流媒体视频汇聚技术推动安防监控智能升级
随着科技的飞速发展,视频已成为我们日常生活和工作中的重要组成部分。尤其在远程办公、在线教育、虚拟会议等领域,视频的应用愈发广泛。为了满足日益增长的视频需求,流媒体视频汇聚融合技术应运而生,它不仅改变了传统视频的观看和…...
Spring MVC数据绑定和响应——数据回写(二)JSON数据的回写
项目中已经导入了Jackson依赖,可以先调用Jackson的JSON转换的相关方法,将对象或集合转换成JSON数据,然后通过HttpServletResponse将JSON数据写入到输出流中完成回写,具体步骤如下。 1、修改文件DataController.java,在…...
怎么快速给他人分享图片?扫描二维码看图的简单做法
现在通过二维码来查看图片是一种很常见的方法,通过二维码来查看图片不仅能够减少对手机存储空间的占用,而且获取图片变得更加方便快捷,只需要扫码就能够查看图片,有利于图片的展现。很多的场景中都有图片二维码的应用,…...
LRCGET:如何用500行代码重定义你的离线音乐体验
LRCGET:如何用500行代码重定义你的离线音乐体验 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 在数字音乐流媒体盛行的时代,我…...
GridTravel:当地人定制旅行指南,开启真实步行探索之旅!
当地人为您量身定制旅行指南GridTravel能将您的旅行变成一段精彩故事。从隐秘小巷中的美食到令人惊叹的美景,它为您规划路线,助您探寻城市的灵魂。还能在App Store下载。由当地人带领,领略城市风情GridTravel是一个由当地人组成的社区&#x…...
Shoelace赞助支持:打造开源项目可持续发展的终极指南
Shoelace赞助支持:打造开源项目可持续发展的终极指南 【免费下载链接】shoelace Shoelace is now Web Awesome. Come see what’s new! 项目地址: https://gitcode.com/gh_mirrors/sh/shoelace Shoelace(现已更名为Web Awesome)作为一…...
不只是连线:用Cadence Virtuoso做PMOS/NMOS版图布局时,那些影响性能和良率的细节(以RF器件为例)
不只是连线:用Cadence Virtuoso做PMOS/NMOS版图布局时,那些影响性能和良率的细节(以RF器件为例) 在集成电路设计中,版图布局远不止是将晶体管简单连接起来的过程。特别是对于RF器件,版图的每一个细节都可能…...
JSON Lint for PHP:如何构建企业级JSON数据验证解决方案?
JSON Lint for PHP:如何构建企业级JSON数据验证解决方案? 【免费下载链接】jsonlint JSON Lint for PHP 项目地址: https://gitcode.com/gh_mirrors/jso/jsonlint 在现代Web开发和API设计中,JSON数据验证是确保系统稳定性的关键环节。…...
OpenAshare:本地化AI开发工具集,模块化集成Ollama与LangChain
1. 项目概述:一个为开发者打造的本地化AI工具集最近在GitHub上闲逛,发现了一个挺有意思的项目,叫“OpenAshare”。初看这个名字,你可能会联想到“开源分享”之类的概念,但点进去之后,我发现它的定位远比一个…...
车载以太网测试避坑指南:DoIP和DIVA测试中那些容易搞错的VLAN与地址配置
车载以太网测试避坑指南:DoIP和DIVA测试中那些容易搞错的VLAN与地址配置 在车载以太网测试领域,DoIP(Diagnostics over Internet Protocol)和DIVA(Diagnostic IP Vehicle Access)测试已成为现代车辆诊断和通…...
ARM GICv3中断控制器系统寄存器解析与应用
1. ARM GICv3中断控制器系统寄存器深度解析在ARMv8-A架构的嵌入式系统中,中断控制器扮演着至关重要的角色。作为硬件中断信号的中枢管理系统,GIC(Generic Interrupt Controller)从v3版本开始进行了革命性的架构革新,其…...
猫抓cat-catch浏览器扩展:专业级资源嗅探与下载解决方案
猫抓cat-catch浏览器扩展:专业级资源嗅探与下载解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾遇到这样的情况&#…...
Perplexity搜索ACM结果不排序?揭秘影响因子加权算法逆向工程,自定义排序脚本已开源
更多请点击: https://intelliparadigm.com 第一章:Perplexity ACM论文查询 Perplexity 是一款基于大语言模型的智能研究助手,支持对 ACM Digital Library 等权威学术资源进行语义化检索。与传统关键词搜索不同,它能理解自然语言提…...
