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

news2024/9/24 7:23:02

在这里插入图片描述

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

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

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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')  # 没有值则返回None
    user = request.cookies.get('user')          # 没有值则返回None
    print(f"username={username},user={user}")   # username=xiaoming,user=xiaoming
    return "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')  # 没有值则返回None
    user = request.cookies.get('user')          # 没有值则返回None
    print(f"username={username},user={user}")   # username=jigntian,user=jigntian
    return "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 response




if __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, session

from 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.coloradmin.cn/o/1534296.html

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

相关文章

小迪安全43WEB 攻防-通用漏洞任意文件下载删除重装敏感读取黑白审计

#知识点: 1、文件操作类安全问题 2、文件下载&删除&读取 3、白盒&黑盒&探针分析 #详细点: 文件读取:基本和文件下载利用类似 文件下载:利用下载获取源码或数据库配置文件及系统敏感文件为后续出思路 …

第四百一十六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容,本章回中将介绍自定义Action菜单.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

走进jvm之垃圾回收器篇

这里我想首先说明一下,虽然我们经常会拿垃圾回收器来做比较,虽然想挑选一个最好的收集器出来,但是目前也没有说哪一款收集器是完美的,更不存在万能的收集器,我们也只是对收集器选择最适合场景的一个收集器。 那么作者将…

WP免费主题2个分享给需要的人

免费wordpress主题 粉色高端大气的免费wordpress主题,用免费的主题也可以搭建wordpress网站。 https://www.wpniu.com/themes/12.html 免费WP模板 绿色清爽的wordpress建站模板,用免费的WP模板也可以搭建出精美网站。 https://www.wpniu.com/themes/…

必学干货!使用Python正则表达式匹配多个字符

1.匹配多个字符 今天我们来聊一聊正则表达式中一个很强大的功能:匹配多个字符!正则表达式是一个非常强大的工具,可以帮助我们轻松地处理和匹配字符串。通过使用不同的符号和技巧,我们可以匹配多个字符,从而更加灵活地…

【网页实战项目设计】基于SSM的医院预约挂号系统

基于SSM的医院预约挂号系统 项目截图 开发环境与技术框架 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具&a…

计算机三级——网络技术(综合题第三题)

DHCP报文分析常用命令及英文单词的含义 Source:源地址(缩写:Src)Destitation:目的地址(缩写:Dst)ipconfig/all:查看客户机获得的IP地址及其他配置情况ipconfig/release:释放获得的地址(源地址 …

Linux系统——nload命令

目录 引言 一、nload安装 二、nload命令详解 1.命令使用 2.命令详解 3.命令选项 3.1-u选项 nload -u h 自动变更单位,Bit/s nload -u H 自动变更单位,Byte/s 3.2-m选项 nload -m 不显示流量图 nload -m -H ens33 不显示流量图,以By…

基于浏览器localStorage作为数据库完成todolsit项目

一、文章内容 TodoList结构搭建HTML代码 TodoList样式编写Css代码 TodoList行为表现JavaScript代码 二、项目展示 项目介绍 Todolist是一个基于B/S模式开发的待办事项软件,主要功能是离线记录用户的待办事项和已经完成的事情,基于htmlcssjs实现&am…

TSINGSEE青犀AI智能分析网关V4酿酒厂安全挂网AI检测算法

在酿酒行业中,安全生产一直是企业经营中至关重要的一环。为了确保酒厂生产过程中的安全,TSINGSEE青犀AI智能分析网关V4的安全挂网AI检测算法发挥了重要作用。 TSINGSEE青犀AI智能分析网关V4的安全挂网检测算法是针对酒厂里酒窖挂网行为进行智能检测与识…

Linux第82步_“gpio子系统”下的使用KEY开关灯

使用新字符设备驱动的一般模板和“gpio子系统”,以及设备树,驱动KEY和LED。 1、在stm32mp157d-atk.dts文件中添加“gpio_led”和“key0”节点 打开虚拟机上“VSCode”,点击“文件”,点击“打开文件夹”,点击“zgq”&…

设置客户端桌面壁纸 文件夹重定向

域策略-设置客户端桌面壁纸 1/服务器管理器组策略管理-gwy.com-Defait Domain Policy-右击编辑 2/用户配置-首选项-置windows设置-文件夹-右击文件夹-创建-C:\bgp-应用 3/在客户端策略更新-gpupdate /force 命令符-查看是否正确 4/服务器创建c:\image\R-C.jpg,共享文…

G - Find a way

题目分析 1.双重bfs,遍历两个起点求最短路再计算总和即可 2.唯一的坑点在于对于一个KFC&#xff0c;两人中可能有一个到不了&#xff0c;所以还要对到不了的点距离做处理 #include <bits/stdc.h> using namespace std; using ll long long; const int N 220;struct pos…

[python]bar_chart_race绘制动态条形图

最近在 B 站上看到了一个宝藏 up 主&#xff0c;名叫 "Jannchie见齐"&#xff0c;专门做动态条形图相关的数据可视化。 可以看到做出的效果还是很不错的&#xff0c;但工具使用的是 JS&#xff0c;不是 Python&#xff0c;于是尝试搜索了一下&#xff0c;看看 Python…

读取pdf文件转为txt文件,使用正则表达式删除页码

通过下述链接中的代码python 读取pdf中的文本&#xff0c;读取pdf的文字到txt文本中。 txt文本中&#xff0c;包含pdf的页码信息&#xff0c;使用如下代码删除pdf的页码 下述是包含页码信息的一段文本&#xff0c;在其中给出了4中不同格式的页码信息。 text ""&qu…

机器视觉学习(四)—— 图像的色彩

目录 一、图像的基础知识 二、NumPy模块 三、图像色彩变化 3.1 RGB图像的分通道显示 3.2 HSV图像的分通道显示 一、图像的基础知识 总结的笔记&#xff1a; """ 二值图: 每个像素取值 0或1,图像显示出来只有黑白色; 黑色:0 白色:1 灰度图: …

CSDN学习笔记总索引(2024)——我的创作纪念日(1024)

从2021-05-21至2024-03-21&#xff0c;我的CSDN博文学习笔记中&#xff0c;收集并展示浏览阅读&#xff0c;点赞收藏评论等数据&#xff0c;以浏览阅读量排逆序展示。 (笔记模板由python脚本于2024年03月21日 10:07:07创建&#xff0c;本篇笔记适合熟悉Python&#xff0c;对其基…

spring boot3登录开发-2(2短信验证码接口实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 内容简介 短信验证码接口实现 1.依赖导入 2.接口分析 3.实现思路 3.功能实现 创建发送短信…

PTA L2-041 插松枝 代码附注释

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始状态为空。每人面前有用不完的松枝干和一个推送器&#xff0c;每次推送一…