【python】flask基于cookie和session来实现会话控制

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。

所属的专栏:flask框架零基础,进阶应用实战教学
景天的主页:景天科技苑

文章目录

  • http的会话控制
    • Cookie
    • 1.设置cookie
    • 2.获取cookie
    • 3.删除cookie
    • Session
    • 1.设置session
    • 2.设置session有效期
    • 4.获取session
    • 5.删除session

http的会话控制

所谓的会话(session),就是客户端浏览器和服务端网站之间一次完整的交互过程.

会话的开始是在用户通过浏览器第一次访问服务端网站开始.

会话的结束时在用户通过关闭浏览器以后,与服务端断开.

所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。

为什么要有会话控制?因为 http 是一种无状态协议,浏览器请求服务器是无状态的。

无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,对于服务端而言,客户端的每次请求都是一次新的请求。

无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且客户端也会在处理页面完毕之后销毁页面对象。

有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等

实现状态保持主要有两种方式:

  • 在客户端存储信息使用Cookie(废弃),token[jwt,oauth]
  • 在服务器端存储信息使用Session,数据库

Cookie

Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就随着请求头自动发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
Cookie的key/value可以由服务器端自己定义。

使用场景: 登录状态, 浏览历史, 网站足迹,购物车 [不登录也可以使用购物车]

Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用

Cookie基于域名安全,不同域名的Cookie是不能互相访问的

如访问fuguang.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到fuguang.com写的Cookie信息,只能获取到baidu.com的Cookie信息。

浏览器的同源策略针对cookie也有限制作用.

当浏览器请求某网站时,浏览器会自动将本网站下所有Cookie信息随着http请求头提交给服务器,所以在request中可以读取Cookie信息
在这里插入图片描述

1.设置cookie

设置cookie需要通过flask的Response响应对象来进行设置,由响应对象会提供了方法set_cookie给我们可以快速设置cookie信息。

视图函数如下:

@app.route("/set_cookie")
def set_cookie():"""设置cookie,通过response传递到客户端进行保存"""response = make_response('默认首页')response.set_cookie('username', 'jingtian')            # session会话期有效,关闭浏览器后当前cookie就会被删除 如果没有设置max_age,则当前cookie变量会在浏览器关闭(会话结束以后被浏览器删除)response.set_cookie('user', 'jigntian', max_age=30 )   # 指定有效时间,过期以后浏览器删除cookie,max_age=30秒return response

在这里插入图片描述

浏览器查看cookie
在这里插入图片描述

2.获取cookie

#获取cookie
@app.route("/get_cookie")
def get_cookie():"""获取来自客户端的cookie"""print(request.cookies)  # ImmutableMultiDict([])username = request.cookies.get('username')  # 没有值则返回Noneuser = request.cookies.get('user')          # 没有值则返回Noneprint(f"username={username},user={user}")   # username=xiaoming,user=xiaomingreturn "get cookie"

浏览器访问
在这里插入图片描述

终端打印,失效的cookie获取不到位None
在这里插入图片描述

3.删除cookie

cookie保存客户端浏览器中的,所以服务端无法直接删除cookie
要实现删除cookie,只能告诉浏览器,cookie过期了,让浏览器自动删除
删除cookie,重新设置cookie的时间,让浏览器自己根据有效期来删除

#删除cookie
@app.route("/del_cookie")
def del_cookie():response = make_response('del cookie')# 删除操作肯定是在浏览器完成的,所以我们重置下cookie名称的对饮有效时间为0,此时cookie的值已经不重要了。response.set_cookie('user', '', max_age=0)response.set_cookie('username', '', max_age=0)return response

在这里插入图片描述

浏览器访问,课件浏览器cookie已被删除
在这里插入图片描述

完整代码:


from flask import Flask, make_response,request# 应用实例对象
app = Flask(__name__)#设置cookie
@app.route("/set_cookie")
def set_cookie():"""设置cookie,通过response传递到客户端进行保存"""response = make_response('默认首页')response.set_cookie('username', 'jingtian')            # session会话期有效,关闭浏览器后当前cookie就会被删除response.set_cookie('user', 'jigntian', max_age=30 )   # 指定有效时间,过期以后浏览器删除cookie,max_age=30秒return response#获取cookie
@app.route("/get_cookie")
def get_cookie():"""获取来自客户端的cookie"""print(request.cookies)  # ImmutableMultiDict([])username = request.cookies.get('username')  # 没有值则返回Noneuser = request.cookies.get('user')          # 没有值则返回Noneprint(f"username={username},user={user}")   # username=jigntian,user=jigntianreturn "get cookie"#删除cookie
@app.route("/del_cookie")
def del_cookie():# cookie保存客户端浏览器中的,所以服务端无法直接删除cookie# 要实现删除cookie,只能告诉浏览器,cookie过期了,让浏览器自动删除"""删除cookie,重新设置cookie的时间,让浏览器自己根据有效期来删除"""response = make_response('del cookie')# 删除操作肯定是在浏览器完成的,所以我们重置下cookie名称的对饮有效时间为0,此时cookie的值已经不重要了。response.set_cookie('user', '', max_age=0)response.set_cookie('username', '', max_age=0)return responseif __name__ == '__main__':# 启动项目的web应用程序app.run(host="0.0.0.0", port=5000, debug=True)

cookie各阶段操作流程
在这里插入图片描述

Session

对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如手机号、验证码等信息

在服务器端进行状态保持的方案就是Session

Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。名字一般叫:session

flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错.

如果将来希望session的生命周期延长,可以通过修改cookie中的sessionID的有效期来完成配置。

session实现方案
在这里插入图片描述

注意:一般框架都是把session数据保存到服务端,但是,flask里面的session是基于token方式存储在客户端的,并没有按照传统的方式保存在服务端的文件中。
在这里插入图片描述

session的ID存在有效期的,默认是会话期,会话结束了,session_id就废弃了。

1.设置session

设置session视图函数如下:

#因为falsk中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项

app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'#设置session
@app.route("/set_session")
def set_session():"""设置session"""session['username'] = 'jingtian'session['info'] = {"name": "jingtian","age": 16,}print(session,type(session))return "set_session"

在这里插入图片描述

浏览器访问,session保存到客户端的cookie中
在这里插入图片描述

看下session和类型
在这里插入图片描述

2.设置session有效期

  后端Flask跟浏览器交互默认情况下,session cookie会在用户关闭浏览器时清除。

通过将session.permanent属性设为True可以将session的有效期延长为31天,也可以通过操作app的配置PERMANENT_SESSION_LIFETIME来设置session过期时间。
设置有效期,需要到导包

from datetime import timedelta
# 以下两步设置过期时间
session.permanent = True # 开启设置有效期,默认为31天后过期
app.permanent_session_lifetime = timedelta(minutes=10)
return "set_session"

在这里插入图片描述

浏览器访问,可以看到session有效期为10分钟
在这里插入图片描述

4.获取session

@app.route("/get_session")
def get_session():"""获取session"""print(session.get('username'))print(session.get('info'))return "get session"

浏览器访问
在这里插入图片描述

终端打印session
在这里插入图片描述

5.删除session

@app.route("/del_session")
def del_session():"""删除session,键如果不存在,则会抛出异常,所以删除之前需要判断键是否存在。"""if "username" in session:session.pop("username")if "info" in session:session.pop("info")return "del_session"

浏览器访问,session被删除
在这里插入图片描述

完整代码:


from flask import Flask, sessionfrom datetime import timedelta# 应用实例对象
app = Flask(__name__)#因为falsk中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项
app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'#设置session
@app.route("/set_session")
def set_session():"""设置session"""session['username'] = 'jingtian'session['info'] = {"name": "jingtian","age": 16,}print(session,type(session))# 以下两步设置过期时间session.permanent = True # 开启设置有效期,默认为31天后过期app.permanent_session_lifetime = timedelta(minutes=10)return "set_session"#获取session
@app.route("/get_session")
def get_session():"""获取session"""print(session.get('username'))print(session.get('info'))return "get session"#删除session
@app.route("/del_session")
def del_session():"""删除session,键如果不存在,则会抛出异常,所以删除之前需要判断键是否存在。"""if "username" in session:session.pop("username")if "info" in session:session.pop("info")return "del_session"if __name__ == '__main__':# 启动项目的web应用程序app.run(host="0.0.0.0", port=5000, debug=True)

使用过程中,session是依赖于Cookie的,所以当cookie在客户端被删除时,对应的session就无法被使用了。

总结:
综上,就是falsk通过cookie和session来控制http会话的全部解析,通常我们可以用cookie和session来保持用户登录等,喜欢的朋友可以一键三连,falsk持续更新中,总有适合你的!!!

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

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

相关文章

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0 App+微信小程序+云平台

✨本人自己开发的开源项目:土拨鼠充电系统 ✨踩坑不易,还希望各位大佬支持一下,在Gitee或GitHub给我点个 Start ⭐⭐👍👍 ✍Gitee开源项目地址👉:https://gitee.com/cheinlu/groundhog-charging…

力扣Lc19--- 268. 丢失的数字(java版)-2024年3月20日

1.题目描述 2.知识点 (1)比如数组里面有n个数,然后计算这n个数的总和(用等差求和数列计算),然后减去数组的和,用总和减去数组和即为所得 (2)加强型 for 循环(也称为 for-each 循环&…

单片机--数电(4)

触发器 数字电路中:分组合逻辑电路与时序逻辑电路两大类 组合逻辑电路的基本单元是门电路(与或非等一些门电路) 时序逻辑电路的基本单元是触发器 触发器与门电路的区别 门电路某一时刻的输出信号完全取决于该时刻的输入信号,…

销售数据分析怎么做?用好这5个数据分析方法与模型就足够了。

企业经营其实简单来说就是做买卖,有了买卖自然就产生了销售数据,那怎么能让这些销售数据产生价值呢?答案就是数据分析。通过对销售数据的分析,可以帮助企业及时洞察市场动向,发现企业销售过程中的问题,调整…

ResNet《Deep Residual Learning for Image Recognition》

ResNet论文学习 引言Deep Residual Learning 深度残差学习网络结构 总结代码复现 引言 深度网络自然地以端到端的多层方式集成低/中/高级特征和分类器,特征的“级别”可通过堆叠层的数量来丰富 随着网络层数加深,提取的特征越强,但是 网络…

表情识别数据集

表情视频数据集 在许多的研究中,研究者通常会把人脸表情识别区分为静态的人脸表情识别(static facial emotion recognition)和动态的人脸表情识别(dynamic facial emotion recognition)。前者希望通过单张图片辨别人的表情从而达到识别人情绪的目的,而后者希望感知视频/…

进程的概念 | PCB | Linux下的task_struct | 父子进程和子进程

在讲进程之前首先就是需要去回顾一下我们之前学的操作系统是干嘛的,首先操作系统是一个软件,它是对上提供一个良好高效,稳定的环境的,这是相对于用户来说的,对下是为了进行更好的软硬件管理的,所以操作系统…

TinyEMU源码分析之虚拟机初始化

TinyEMU源码分析之虚拟机初始化 1 初始化结构参数2 配置RAM地址空间3 初始化设备4 拷贝BIOS和Kernel5 手动写入5条指令6 体验第一条指令的执行 本文属于《 TinyEMU模拟器基础系列教程》之一,欢迎查看其它文章。 本文中使用的代码,均为伪代码&#xff0c…

vue2使用webSocket双向通讯

基于webSocket实现双向通信,使用webworker保持心跳。 由于浏览器的资源管理策略会暂停或限制某些资源的消耗,导致前端心跳包任务时效,后端接收不到webSocket心跳主动断开,因此需要使用webworker保持心跳 引入webworker npm insta…

关于安卓调用文件浏览器(一)打开并复制

背景 最近在做一个硬件产品,安卓应用开发。PM抽风,要求从app打开文件浏览器,跳转到指定目录,然后可以实现文件复制粘贴操作。 思考 从应用开发的角度看,从app打开系统文件浏览器并且选择文件,这是很常见…

.NET Framework 服务实现监控可观测性最佳实践

环境信息 系统环境:Windows Server开发语言:.NET Framework > 4.6.1APM探针包:ddtrace 准备工作 安装 Datakit 主机部署: 主机安装 - 观测云文档 打开采集 APM 采集器 Windows 主机配置 # 到如下路径,把ddtr…

广东省30m二级分类土地利用数据(矢量)

广东省,地处中国大陆最南部,属于东亚季风区,从北向南分别为中亚热带、南亚热带和热带气候,是中国光、热和水资源最丰富的地区之一。主要河系为珠江的西江、东江、北江和三角洲水系以及韩江水系。广东省面积为17.977万平方公里&…

vue+element 前端实现增删查改+分页,不调用后端

前端实现增删查改分页&#xff0c;不调用后端。 大概就是对数组内的数据进行增删查改分页 没调什么样式&#xff0c;不想写后端&#xff0c;当做练习 <template><div><!-- 查询 --><el-form :inline"true" :model"formQuery">&l…

高性能 MySQL 第四版(GPT 重译)(一)

前言 由 Oracle 维护的官方文档为您提供了安装、配置和与 MySQL 交互所需的知识。本书作为该文档的伴侣&#xff0c;帮助您了解如何最好地利用 MySQL 作为强大的数据平台来满足您的用例需求。 本版还扩展了合规性和安全性在操作数据库足迹中的日益重要作用。隐私法律和数据主…

使用Java版工程行业管理系统源码,提升工程项目的综合管理能力

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…

Java------数据结构之栈与队列(简单讲解)

本篇碎碎念&#xff1a;时隔n个月&#xff0c;继续写博客&#xff0c;假期落下的进度&#xff0c;在开学后努力追赶&#xff0c;假期不努力&#xff0c;开学徒伤悲啊&#xff0c;此时此刻真想对自己说一句&#xff0c;活该啊~~~~ 欠下的链表练习题讲解会在下次更新~~~~ 今日份励…

Ubuntu20.04 安装fcitx5输入法

序 ubuntu 20.04.3下fcitx5 需要从flatpak安装&#xff0c;&#xff08;由于qt版本&#xff0c;fcitx5-config只能安装在20.10上&#xff09;&#xff0c;中间出了各种问题&#xff0c;最后发现以下解决方案最好&#xff1a; 安装flatpak (建议使用官方ppa,版本较新) 1 2 3 …

视频素材库网站下载的地方在哪里?

视频素材库网站下载的地方在哪里&#xff1f;这是很多短视频创作者都会遇到的问题。别着急&#xff0c;今天我就来给大家介绍几个视频素材库网站下载的好去处&#xff0c;让你的视频创作更加轻松有趣&#xff01; 蛙学网&#xff1a;视频素材库网站下载的一定要选择蛙学网啦&am…

C++利用开散列哈希表封装unordered_set,unordered_map

C利用开散列哈希表封装unordered_set,unordered_map 一.前言1.开散列的哈希表完整代码 二.模板参数1.HashNode的改造2.封装unordered_set和unordered_map的第一步1.unordered_set2.unordered_map 3.HashTable 三.string的哈希函数的模板特化四.迭代器类1.operator运算符重载1.动…

【计算机考研】杭电 vs 浙工大 怎么选?

想求稳上岸的话&#xff0c;其他几所学校也可以考虑&#xff0c;以留在本地工作的角度考虑&#xff0c;这几所学校都能满足你的需求。 如果之后想谋求一份好工作&#xff0c;肯定优先杭电是比较稳的&#xff0c;当然复习的时候也得加把劲。 这个也可以酌情考虑&#xff0c;报…