flask教程6:cookie和session
文章目录
- 一、cookie
- 1.1 什么是cookie?
- 1.2 使用cookie
- 1.2.1 设置cookie
- 1.2.2设置cookie的有效期
- 1.2.3在Flask中查询cookie
- 1.2.4删除cookie
- 二、session
- 2.1实现session的两种思路
- 2.1.1 第一种
- 2.1.2 第二种
- 2.2使用session
- 2.2 .1设置session
- 2.2.2 设置有效期
- 2.2.3 获取session
- 2.2.4删除session
一、cookie
1.1 什么是cookie?
一般web通信是基于HTTP的,HTTP是无状态的协议,也就是说,在一次请求响应结束后,服务器不会留下任何有关于对方状态信息,所以需要保持web浏览器的状态。
比如:对于有些web应用来说,客户端的某些信息必须被记住。比如用户登录过后跳转页面依然要保持登录的状态,进行其他的业务访问,而当这个登录过的用户再次访问web服务器的时候,web服务器并不知道这个用户已经登录过了,所以无法进行其他需要权限的业务访问。所以cookie技术的出现就是为了解决这个问题。
- web通讯一般基于HTTP协议,HTTP是无状态协议
- Cookie技术是用来保持web访问状态,Cookie技术通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息。
- 服务器可以设置cookie的有效期,浏览器会自动清除过期的cookie。
- cookie有域名的概念,只有访问同一个域名,才会把之前相同域名返回的cookie携带给该服务器。
1.2 使用cookie
1.2.1 设置cookie
设置cookie的时候是由我们web服务器设置,也就是在Flask项目中生成cookie,经由响应报文返回给浏览器保存cookie,下次浏览器再访问web服务器的时会在请求报文中把cookie携带过来,所以cookie产生的起点是在web服务器中,也就是我们的Flask项目中。
在Flask中如果想要在响应中添加一个cookie,最方便的做法是使用内置的Response类提供的==set_cookie()==方法。
set_cookie()方法的参数
| 属性 | 说明 |
|---|---|
| key | cookie的键(名称) |
| value | cookie的值 |
| max_age | cookie被保存的时间数,单位为秒。 |
| expires | 具体的过期时间,一个datetime对象或UNIX时间戳 |
| path | 限制cookie只在给定的路径可用,默认为整个域名下路径都可用 |
| domain | 设置cookie可用的域名,默认是当前域名,子域名需要利用通配符domain=.当前域名 |
| secure | 如果设为True,只有通过HTTPS才可以用 |
| httponly | 如果设为True,进制客户端JavaScript获取cookie |
项目目录
│ app.py
│
├─static # 文件夹
└─templates # 文件夹
app.py
from flask import Flask, Responseapp = Flask(__name__)@app.route('/')
def hello_world():resp = Response('设置cookie给浏览器')resp.set_cookie('user_name', 'yudengwu')return respif __name__ == '__main__':app.run()
解读 app.py:
(1) 首先导入Flask内置的Response类,用于在响应报文中设置cookie
from flask import Flask,request, Response
(2) 在视图函数实例化Response类并传入返回的内容,Response类实例化出的对象调用set_cookie()方 法,set_cookie内的第一个参数是设置cookie的key,第二个参数是用来设置cookie的value,然后返回该对象,就会携带着设置好的cookie返回给浏览器保存。
app = Flask(__name__)
@app.route('/')
def hello_world():resp = Response('设置cookie给浏览器')resp.set_cookie('user_name', 'yudengwu')return resp
在浏览器中查看cookie的三种方式(以Chrome浏览器为例)
-
第一种: 右键检查----->Network---->找到访问的域名---->找到Response Headers---->Set-Cookie

-
第二种:点击url输入框左边的信息icon,然后找到响应的域名,展开查看cookie。


-
第三种:设置---->内容设置---->Cookie---->查看所有cookie设置----->根据域名搜索对应的cookie信息

1.2.2设置cookie的有效期
注意:Flask服务器默认设置cookie有效期为关闭浏览器后cookie失效
- 基于max_age参数设置cookie有效期
再设置cookie的调用set_cookie()时候传入关键字实参max_age 值,这个值代表多少秒后过期
from flask import Flask, Responseapp = Flask(__name__)@app.route('/')
def hello_world():resp = Response('设置cookie给浏览器')resp.set_cookie('user_name', 'yudengwu',max_age=600)return respif __name__ == '__main__':app.run()
- 基于expires参数设置cookie有效期
再设置cookie的调用set_cookie()时候传入关键字实参 expires= 值,这个值代具体的过期时间,一个datetime对象或UNIX时间戳。
使用expires参数,就必须会用格林尼治时间(也就是相对北京时间少8个小时,因为浏览器会默认把服务器传来的时间值当做标准格林尼治时间,并根据当地的时区做调整 。
from flask import Flask, Response
import datetime
import time
app = Flask(__name__)@app.route('/')
def hello_world():resp = Response('设置cookie给浏览器, cookie设置过期时间为一个月后')expires = datetime.datetime.now() + datetime.timedelta(days=30, hours=16)resp.set_cookie('user_name', 'mark', expires=expires)return respif __name__ == '__main__':app.run()
1.2.3在Flask中查询cookie
查询cookie 是通过请求对象的cookies属性读取,读取的过程是使用设置cookie时的key来读取到设置cookie的value
from flask import Flask, Response,request
import datetime
import time
app = Flask(__name__)@app.route('/')
def hello_world():resp = Response('设置cookie给浏览器')resp.set_cookie('user_name', 'yudengwu', max_age=600)return resp@app.route('/get_cookie/')
def get_cookie():user_name = request.cookies.get('user_name')if user_name == 'yudengwu':return '{}的信息'.format(user_name)return 'cookie验证失败'if __name__ == '__main__':app.run()
1.2.4删除cookie
删除cookie是通过Flask内置的Response类实例化出的对象调用delete_cookie(‘key’),删除的过程是使用设置cookie时的key来删除cookie信息。
from flask import Flask, Response,request
import datetime
import time
app = Flask(__name__)@app.route('/')
def hello_world():resp = Response('设置cookie给浏览器')resp.set_cookie('user_name', 'yudengwu', max_age=600)return resp@app.route('/get_cookie/')
def get_cookie():user_name = request.cookies.get('user_name')if user_name == 'yudengwu':return '{}的信息'.format(user_name)return 'cookie验证失败'@app.route('/del/')
def del_cookie():resp = Response('删除cookie')resp.delete_cookie('user_name')return respif __name__ == '__main__':app.run()
二、session
session:session和cookie的作用有点类似,都是为了存储用户相关的数据。不同的是,cookie存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但是存储在服务器上会占用服务器资源。与cookie不同的是,session是一个思路,一个概念,一个服务器存储授权信息的解决方案。不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现方案不一样,但是他们的目的都是服务器为了方便存储数据的。session的出现,是为了解决cookie存储信息不安全的问题。
session还可以存储到客户端。客户端发送验证信息之后,服务器把相关的验证信息进行加密,然后将加密后的数据存储到cookie中,返回给浏览器,以后浏览器在请求服务器的时候,会自动将机密的session信息发送给服务端。服务端对数据进行解密之后,在进行验证。flask中使用的就是这种机制。
2.1实现session的两种思路
2.1.1 第一种
- 客户端携带用户信息请求服务端验证。
- 服务端验证成功后生成随机的session_id与用户信息建立映射后存储到数据库中(注意:数据库可以是任意永久化保存数据的机制,如redis、memcached、mysql、甚至是文件等等)。
- 服务端把刚刚生成的session_id作为cookie信息返回给客户端。
- 客户端收到以session_id为内容的cookie信息保存到本地。
- 客户端再次请求的时候会携带以session_id为内容的cookie去访问服务端,服务端取出session_id去数据库校验得到用户信息。

2.1.2 第二种
- 客户端携带用户信息请求服务端验证。
- 服务端收到用户信息验证成功后,服务端再把用户信息经过严格的加密加盐生成session信息。并且把刚刚生成的session信息作为cookie的内容返回给客户端。
- 客户端收到以session信息为内容的cookie保存到本地。
- 客户端再次请求的时候会携带以session信息为内容的cookie去访问服务端,服务端取出session信息经过解密得到用户的信息。
注意:flask使用的就是第二种思路,利用加密解密的方式实现session,实现安全的cookie,服务端并不会做永久化的储存。
2.2使用session
2.2 .1设置session
Flask提供了session对象用来将cookie加密储存,session通过秘钥对数据进行签名以加密数据。
from flask import Flask, session,Response
import osapp = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) # 配置session使用的秘钥@app.route('/')
def set_session_info():resp = Response('前端')session['username'] = 'mark'session['userphone'] = '123456' # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器return respif __name__ == '__main__':app.run()
2.2.2 设置有效期
后端Flask跟浏览器交互默认情况下,session cookie会在用户关闭浏览器时清除。通过将session.permanent属性设为True可以将session的有效期延长为31天,也可以通过操作app的配置PERMANENT_SESSION_LIFETIME来设置session过期时间。
from flask import Flask, session,Response
import osapp = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) # 配置session使用的秘钥@app.route('/')
def set_session_info():resp = Response('前端')session['username'] = 'yudengwu'session['userphone'] = 'yudengwu' # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器session.permanent = True # 开启设置有效期,默认为31天后过期return respif __name__ == '__main__':app.run()
通过设置PERMANENT_SESSION_LIFETIME指定具体的过期时间
from flask import Flask, session,Response
import os
from datetime import timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) # 配置session使用的秘钥@app.route('/')
def set_session_info():resp = Response('前端')session['username'] = 'yudengwu'session['userphone'] = 'yudengwu' # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器#以下两步设置过期时间session.permanent = True #必须要有app.permanent_session_lifetime = timedelta(minutes=10)return respif __name__ == '__main__':app.run()
2.2.3 获取session
在Flask中获取设置的session信息通过session对象获取,session对象是继承了字典类,所以获取的时候是字典的取值方式。其内部会把浏览器传过来的session信息解密。
from flask import Flask, session,Response
import osapp = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) # 配置session使用的秘钥@app.route('/')
def set_session_info():resp = Response('前端')session['username'] = 'yudengwu'session['userphone'] = 'yudengwu' # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器return resp@app.route('/get_session/')
def get_session():username = session.get('username')userphone = session.get('userphone')if username or userphone:return "{},{}".format(username, userphone)return "session为空"if __name__ == '__main__':app.run()
2.2.4删除session
 session对象调用==pop()==可以根据具体的session的key清除掉指定的session信息。
 session对象调用==clear()==可以清除此次请求的浏览器关于本域名的所有session信息
from flask import Flask, session,Response
import os
from datetime import timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) # 配置session使用的秘钥@app.route('/')
def set_session_info():resp = Response('前端')session['username'] = 'yudengwu'session['userphone'] = 'yudengwu' # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器#以下两步设置过期时间session.permanent = Trueapp.permanent_session_lifetime = timedelta(minutes=10)return resp@app.route('/get_session/')
def get_session():username = session.get('username')userphone = session.get('userphone')if username or userphone:return "{},{}".format(username, userphone)return "session为空"@app.route('/del_session/')
def del_session():session.pop('username')# session.clear()return '删除成功'if __name__ == '__main__':app.run()


相关文章:
flask教程6:cookie和session
文章目录一、cookie1.1 什么是cookie?1.2 使用cookie1.2.1 设置cookie1.2.2设置cookie的有效期1.2.3在Flask中查询cookie1.2.4删除cookie二、session2.1实现session的两种思路2.1.1 第一种2.1.2 第二种2.2使用session2.2 .1设置session2.2.2 设置有效期2.2.3 获取se…...
【JavaEE初阶】第六节.网络原理TCP/IP协议
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、TCP/IP协议五层协议栈; 1.1 应用层协议; 二、传输层协议; 2.1 UDP协议; 2.2 TCP协议; 2.…...
模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)
模式识别 —— 第六章 支持向量机(SVM)与核(Kernel) 文章目录模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)硬间隔(Hard-Margin)软间隔(Soft…...
总结 synchronized
目录synchronized的特性1. 互斥2. 刷新内存3. 可重入synchronized的使用1. 直接修饰普通方法2. 修饰静态方法3. 修饰代码块synchronized的锁机制基本特点关键锁策略 : 锁升级synchronized的特性 1. 互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized…...
360周鸿祎又“开炮”:GPT 6-8就将产生自主意识!我们来测算一下对错
数据智能产业创新服务媒体——聚焦数智 改变商业近日,360的周鸿祎放言“GPT6到GPT8人工智能将会产生意识,变成新的物种。未来,人工智能大语言模型有可能实现自我进化,自动更新系统和自我升级,或者指数级进化能力&am…...
python——飞机大战小游戏
目录 1、导入模块 2、窗口操作 3、事件操作 4、长按事件 5、添加游戏背景 6、添加英雄飞机 7、获取飞机的图片矩形 8、基本游戏窗口 9、添加游戏窗口图片 10、英雄飞机登场 11、英雄飞机装备子弹并发射 1、enemy_plane 2、game_main 3、game_map 4、game_score …...
数组(完全二叉树)向下建堆法与堆排序O(N*logN)
TIPS AdjustUp & AdjustDown向上调整AdjustUp与向下调整AdjustDown的参数是一个数组(完全二叉树)需要进行调整操作的数值的下标/一个数组(完全二叉树)堆元素个数需要调整操作的数值的下标。实际上就是对完全二叉树当中的某一点…...
Lua require 函数使用
从 Lua 的用户文档中我们知道 require("modName") 函数是用来加载模块的,而如果这个modName已经用require 加载过的,再调用require时,将直接返回模块的值。因为函数首先查找 package.loaded 表, 检测 modName 是否被加载…...
【面试】如何定位线上问题?
这个面试题我在两年社招的时候遇到过,前几天面试也遇到了。我觉得我每一次都答得中规中矩,今天来梳理复盘下,下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路去答: 1、如果线上出现了问题,我们更多…...
字节二面,原来我对自动化测试的理解太浅了
如果你入职一家新的公司,领导让你开展自动化测试,作为一个新人,你肯定会手忙脚乱,你会如何落地自动化测试呢? 01 什么是自动化 有很多人做了很长时间的自动化但却连自动化的概念都不清楚,这样的人也是很悲…...
Android11.0 应用升级成功后立即断电重启,版本恢复
问题:客户反馈内置的应用升级成功后立刻断电重启,应用的版本被恢复。 使用adb命令升级客户应用,查看版本显示已更新,/data/system目录下packages.xml和packages.xml中应用版本信息均已更新 C:\Users\dell>adb shell dumpsys …...
关于python常用软件用法:Pycharm 常用功能
人生苦短,我用python 一.Pycharm的基本使用 1.在Pycharm下为你的Python项目配置Python解释器 (1).Setting>Project Interpreter>源码资料电子书:点击此处跳转文末名片获取 二.在Pycharm下创建Python文件、Python模块 1.File>New&g…...
SOLIDWORKS你不知道的小技巧
◉ SOLIDWORKS圆弧长度标注点智能标注,再选中该圆弧,然后分别点圆弧的两个端点,点击左键可以标注圆弧长度。◉ SOLIDWORKS强力裁剪剪裁实体中的强劲剪裁,除了可以裁剪实体外,还可以任意延伸实体。◉ SOLIDWORKS转折线转…...
有了HTTP,为啥还要用RPC
既然有 HTTP 请求,为什么还要用 RPC 调用? 一直以来都没有深究过RPC和HTTP的区别,不都是写一个服务然后在客户端调用么? HTTP和RPC最本质的区别,就是 RPC 主要是基于 TCP/IP 协议的,而 HTTP 服务主要是基…...
[leetcode] 动态规划
背包 先啃懂 背包九讲 01背包,即物品有限。 for 物品for 容量(倒序)P1048 [NOIP2005 普及组] 采药 [ 原题 | 题解 ] P1049 [NOIP2001 普及组] 装箱问题 [ 原题 | 题解 ] P1507 NASA的食物计划 [ 原题 | 题解 ] P1510 精卫填海 [ 原题 | 题…...
科大奥瑞物理实验——热电偶特性及其应用研究
实验名称:热电偶特性及其应用研究 1. 实验目的: 掌握电位差计的工作原理和结构特点;了解温差电偶测温的原理和方法;学会电位差计的使用及注意事项。 2. 实验器材: 电位差计 标准电池 光电检流计 稳压电源 温差电偶…...
Eclips快捷键大全(超详细)
Eclips快捷键大全(超详细)前言一、常用快捷键二、编辑快捷键三、导航快捷键四、运行和调试快捷键五、重构快捷键六、代码生成快捷键七、项目导航快捷键八、帮助快捷键九、搜索快捷键十、标记快捷键十一、版本控制快捷键十二、其它快捷键前言 本博主将用C…...
整懵了,蚂蚁金服4面成功拿下测开offer,涨薪10k,突然觉得跳槽也不是那么难
蚂蚁的面试挺独特的,每轮面试都没有HR约时间,一般是晚上8点左右面试官来一个电话,问是否能面试,能的话开始面,不能就约一个其他时间。 全程4面,前四面技术面,电话面试,最后一面是HR面…...
C++内存分布malloc-free-new-delete的区别和联系
目录 一、内存分布 1.1内存分布图: 1.2 为什么要将bss和data区分开呢? 1.3 堆和栈有什么区别 二、malloc、free;new、delete 2.1 new和delete是如何实现的,new与malloc的异同处 2.2既然有了malloc/free,C为什么还…...
【华为OD机试 2023最新 】 最多颜色的车辆(C++ 100%)
文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 在一个狭小的路口,每秒只能通过一辆车,假设车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 ,1 ,2 输入描述 第一行输入的是通过的车辆颜色信息 [0,1,1,2] 代表4 秒钟通过的车…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...
