[Flask] Flask会话

news2025/1/13 6:11:01

由于HTTP的无状态性,为了使某个域名下的所有网页能够共享某些数据,Cookie和Session应运而生 

1.Cookie对象

HTTP是无状态(stateless)协议,一次请求响应结束后,服务器不会留下任何关于对方状态的信息

也就是说,尽管在一个页面登录成功,当跳转到另一个页面时,服务器不会记录当前用户的状态

显然这对于大多数Web程序来说是非常不方便的,为了解决这类问题,就有了Cookie技术

Cookie技术是用来保持web访问状态

Cookie技术通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息

服务器可以设置Cookie的有效期,浏览器会自动清除过期的Cookie

Cookie指Web服务器为了存储某些数据(比如用户信息)而保存在浏览器上的小型文本数据

浏览器会在一定时间内保存它,并在下一次向同一个服务器发送请求时附带这些数据

Cookie通常被用来进行用户会话管理

设置Cookie的时候是由我们web服务器设置,也就是在Flask项目中生成Cookie,经由响应报文返回给浏览器保存Cookie,下次浏览器再访问web服务器的时会在请求报文中把Cookie携带过来,所以Cookie产生的起点是在web服务器中,也就是我们的Flask项目中

在Flask中,使用Response类提供的set_cookie()方法可以在响应中添加一个Cookie

其中,set_cookie()方法支持多个参数来设置Cookie的选项

设置Cookie选项的参数
参数说明
keyCookie的键(名称)
valueCookie的值
max_age

Cookie被保存的时间,单位为秒

默认在用户会话结束(关闭浏览器)时过期

expires具体的过期时间,一个datetime对象或UNIX时间戳
path限制Cookie只在给定的路径可用,默认为整个域名下的路径都可用
domain设置Cookie可用的域名
secure如果为True,只有通过HTTPS才可以使用
httponly如果为True,禁止客户端JS获取Cooke

实例1: 使用Cookie判断用户是否登录

cbf1ee2db51f47e99bcc36ce39d41495.png

目录结构

① 创建run.py文件,在文件中创建login()登录页面路由

接收用户提交的表单数据,如果用户名和密码都为"andy123",则表示登录成功。接下来将用户名写入到Cookie

# run.py
from flask import Flask, request, render_template, make_response
app = Flask(__name__)


@app.route('/login', methods=['GET', 'POST'])
def login():
    # 验证表单数据
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username == 'andy123' and password == 'andy123':
            # 如果用户名和密码正确,将用户名写入Cookie
            response = make_response('登录成功!')  # 获取response对象
            # set_cookie内的第一个参数是设置cookie的key,第二个参数是用来设置cookie的value
            response.set_cookie('username', username)  # 将用户名写入Cookie
            return response  # 返回response对象
    return render_template('login.html')  # 渲染表单页面


if __name__ == '__main__':
    app.run(debug=True)

② 在templates路径下创建login.html,代码如下所示

<!--login.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<form action="" method="post">
    <div>
        <label for="username">用户名</label>
        <input type="text" id="username" name="username" value="">
    </div>
    <div>
        <label for="password">密&nbsp;&nbsp;&nbsp;&nbsp;码</label>
        <input type="password" id="password" name="password" value="">
    </div>
    <button type="submit">提交</button>
</form>

</body>
</html>

运行run.py文件,在浏览器访问网址:http://127.0.0.1:5000/login,输入用户名"andy123"和密码"andy123",如下图所示

577c3167d7384cecb071b5c7977578a5.png

 登录页面

然后单击页面中的【提交】按钮,此时会将用户名写入到Cookie中

86ad2fa4ef3c478ebbb574b56a55bc2c.png

③ 在run.py文件中创建index()首页视图函数

判断Cookie值是否存在,如果存在则表示用户已经登录,显示"欢迎来到首页!",否则显示"请先登录!"

查询Cookie是通过请求对象的cookies属性读取,读取的过程是使用设置Cookie时的key来读取到设置Cookie的value

在run.py文件中添加如下代码

@app.route('/')
def index():
    # 判断Cookie是否存在
    if request.cookies.get('username'):
        return '欢迎来到首页!'
    else:
        return '请先登录!'

查看未登录的效果时,需要先清除一下Cookie,在login()视图函数中,并没有设置Cookie的过期时间,则在关闭浏览器时,会自动清除Cookie

所以我们先关闭浏览器,然后再次打开浏览器并访问首页网址: http://127.0.0.1:5000,运行结果如下图所示

ff99f7320c154da59a6ab5bece195616.png

未登录时访问首页效果

接下来访问登录页面网址: htp://127.0.0.1:5000/login,在登录页面输入正确的用户名和密码,此时再次访问首页,运行结果如下图所示

0e29da88bddc41f4a3fefb99b5e8cbed.png

登录后访问首页效果

④ 在run.py文件中创建logout()退出登录视图函数

退出登录时,只需要清除Cookie即可。可以调用set_cookie()方法并设置expires参数值为0,则表示Cookie已经过期,在run.py文件中添加如下代码

@app.route('/logout')
def logout():
    response = make_response('退出登录!')
    # response.delete_cookie('username')
    # 设置Cookie过期时间为0,即删除Cookie
    response.set_cookie('username', '', expires=0)
    return response

删除Cookie也可以通过Flask内置的Response类实例化出的对象调用delete_cookie('key'),删除的过程是使用设置Cookie时的key来删除Cookie信息 

response.delete_cookie('username')

运行run.py文件,在浏览器中访问退出登录的网址: http://127.0.0.1:5000/logout,然后再次访问首页,此时页面显示"请先登录!",表明用户已经退出登录

674af3350d91427eb245f1a39d6a1780.png

退出登录

30e747c3ffad4473be6fcf9081787eec.png

退出登录首页效果 

上述run.py文件完整代码如下所示

# run.py
from flask import Flask, request, render_template, make_response
app = Flask(__name__)


@app.route('/')
def index():
    # 判断Cookie是否存在
    if request.cookies.get('username'):
        return '欢迎来到首页!'
    else:
        return '请先登录!'


@app.route('/login', methods=['GET', 'POST'])
def login():
    # 验证表单数据
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username == 'andy123' and password == 'andy123':
            # 如果用户名和密码正确,将用户名写入Cookie
            response = make_response('登录成功!')  # 获取response对象
            # set_cookie内的第一个参数是设置cookie的key,第二个参数是用来设置cookie的value
            response.set_cookie('username', username)  # 将用户名写入Cookie
            return response  # 返回response对象
    return render_template('login.html')  # 渲染表单页面


@app.route('/logout')
def logout():
    response = make_response('退出登录!')
    # response.delete_cookie('username')
    # 设置Cookie过期时间为0,即删除Cookie
    response.set_cookie('username', '', expires=0)
    return response


if __name__ == '__main__':
    app.run(debug=True)

2.Session对象

前面通过Cookie判断用户是否登录的功能带来一个问题,因为在浏览器中手动添加和修改Cookie是很容易的事情,如果直接把认证信息以明文的方式存储在Cookie里,那么恶意用户就可以通过伪造Cookie的内容来获取对网站的权限,冒用别人的账户

为了避免上述的问题,我们需要对铭感的Cookie内容进行加密,Session的出现就是为了解决Cookie存储数据不安全的问题

Flask提供了Session对象,用来将Cookie数据加密储存 

Session指用户会话(user session),即服务器和客户端/浏览器之间或桌面程序和用户之间建立的交互活动

在Flask中,Session对象用来加密Cookie,默认情况下,它会把数据存储在浏览器上一个名为"session"的Cookie里,Session通过密钥对数据进行签名以加密数据。因此我们需要先设置一个密钥,这里的密钥就是一个具有一定复杂度和随机性的字符串

案例2: 使用Session判断用户是否登录 

0b1a2cd3d7c64702a889d4162838c473.png

目录结构

① 创建run.py文件

引入Flask框架,然后设置密钥,具体代码如下所示

from flask import Flask, request, render_template, session, redirect, url_for
app = Flask(__name__)

app.secret_key = 'andy12345678'  # 设置密钥

然后创建login()登录页面路由,在login()视图函数中判断用户输入的用户名和密码是否正确,如果正确则将"logged_in"写入到session中,具体代码如下所示

@app.route('/login', methods=['GET', 'POST'])
def login():
    # 验证表单数据
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username == 'andy123' and password == 'andy123':
            # Session是一个字典对象
            session['logged_in'] = True  # 写入session
            return redirect(url_for('index'))
    return render_template('login.html')  # 渲染表单页面

创建首页路由,在index视图函数中,使用session.get('logged_in'),即字典取值的方式判断用户是否已经登录,代码如下所示

@app.route('/')
def index():
    if session.get('logged_in'):
        return '欢迎来到首页!'
    else:
        return '请先登录!'

最后创建logout()登出页面路由,在logout()视图函数中,使用session.pop('logged_in'),删除该Session值

@app.route('/logout')
def logout():
    # 解决用户没有登录就直接退出登录的异常情况
    # 在退出登录前,需要先判断用户是否已经登录,未登录的话直接返回到登录页面即可
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    else:
        session.pop('logged_in')
        return redirect(url_for('login'))

上述run.py文件完整代码如下所示

from flask import Flask, request, render_template, session, redirect, url_for
app = Flask(__name__)

app.secret_key = 'andy12345678'  # 设置密钥


@app.route('/')
def index():
    if session.get('logged_in'):
        return '欢迎来到首页!'
    else:
        return '请先登录!'


@app.route('/login', methods=['GET', 'POST'])
def login():
    # 验证表单数据
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username == 'andy123' and password == 'andy123':
            session['logged_in'] = True  # 写入session
            return redirect(url_for('index'))
    return render_template('login.html')  # 渲染表单页面


@app.route('/logout')
def logout():
    # 解决用户没有登录就直接退出登录的异常情况
    # 在退出登录前,需要先判断用户是否已经登录,未登录的话直接返回到登录页面即可
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    else:
        session.pop('logged_in')
        return redirect(url_for('login'))


if __name__ == '__main__':
    app.run(debug=True)

②  在templates路径下创建login.html,代码如下所示

<!--login.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<form action="" method="post">
    <div>
        <label for="username">用户名</label>
        <input type="text" id="username" name="username" value="">
    </div>
    <div>
        <label for="password">密&nbsp;&nbsp;&nbsp;&nbsp;码</label>
        <input type="password" id="password" name="password" value="">
    </div>
    <button type="submit">提交</button>
</form>

</body>
</html>

运行run.py文件,执行效果与案例1一样,读者可自行去演示

其中输入正确的用户名和密码以后,跳转到首页,我们可以查看到Cookie存储了session值

c629a584c1284ba7a3056c77649bf667.png

 

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

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

相关文章

2023年数字人产业发展趋势报告:好看的皮囊到有趣的灵魂

报告来源&#xff1a;腾讯研究院 报告看点&#xff1a;随着交互智能技术的加速发展&#xff0c;数字人正在从技术创新走向产业应用。 在腾讯2022数字生态大会腾讯云智能专场上&#xff0c;腾讯研究院、腾讯云智能、创业黑马经过产业研究、实地调研&#xff0c;共同提炼发布《数…

【Spring】Spring Bean 容器的生命周期是什么样的?

文章目录 一、什么是 Spring Bean 的生命周期&#xff1f;二、Spring 中的 bean 的作用域有哪些?三、Spring Bean 的生命周期四、Spring Bean 的生命周期流程图 一、什么是 Spring Bean 的生命周期&#xff1f; 对于普通的 Java 对象&#xff0c;当 new 的时候创建对象&#…

智头条|2023TUYA开发者大会精彩不断,IDC预测:2026年全球AI服务支出将增至646亿美元

1、行业动态 奢侈品巨头LVMH宣布将推出元宇宙项目“The Journey” 近日&#xff0c;奢侈品巨头LVMH宣布推出元宇宙项目“The Journey”&#xff0c;允许旗下用户进入一个拥有专属产品和体验的全新虚拟世界&#xff0c;目前官网显示该元宇宙项目下包括The Showroom、The Tech …

HotSpot 垃圾收集器

HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器&#xff0c;每种收集器都有各自的特点&#xff0c;虽然我们要对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器&am…

Tomcat的部署及优化

目录 1.Tomcat概述 1.1 Tomcat的组件构成​编辑 1.2 Tomcat功能组件结构 1.3 Tomcat的请求过程 2. Tomcat服务的部署 2.1 搭建Tomcat运行环境 3.设置JDK环境变量​ 3.1测试java环境 4.安装启动Tomcat 1.Tomcat概述 Tomcat 是 基于Java 语言开发的Tomcat 属于轻量级应用服务…

数据结构 | 顺序线性表

一、数据结构定义 typedef int SqlTableType;typedef struct seqTable{int MAXNUM; // 最大元素个数 int curNum; // 元素的个数SqlTableType* element; // 连续空间的起始地址 }*SqlTable; 二、方法概览 SqlTable CreateSqlTable(int max); // 创建空顺序表 …

MySQL——mha高可用

MHA的概念 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过…

【Android -- 面试】程序员面试必备软技能,值得收藏!

文章目录 一、准备技术型简历1. 准备简历模板2. 准备个⼈信息3. 准备专业技能4. 准备⼯作经历5. 准备项⽬经历 二、面试前的准备1. 利用脑图来梳理知识点2. 收到面试邀请后的准备 三、面试的注意事项1. ⾃我介绍2. 技术考察3. 向⾯试官提问4. 面试礼仪 四、如何通过 HR ⾯1. HR…

数据结构 | 顺序栈

一、数据结构定义 typedef int StackType; typedef struct seqStack{int MAXNUM; // 最大元素个数 int top; // 栈顶位置&#xff0c;初始化为0或-1StackType element[100]; // 元素的连续空间的起始地址 } *SeqStack; 二、方法概览 SeqStack CreateSqlStack…

【服务器数据恢复】ZFS文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 某公司一台EMC某型号存储中有一组由12块硬盘组建的raid5磁盘阵列&#xff0c;其中有2块盘作为热备盘使用。 服务器故障&分析&#xff1a; raid5磁盘阵列中有2块磁盘离线&#xff0c;只有1块热备盘成功启用&#xff0c;另外一块热备盘未启用…

Elastic 栈中的 Kibana安装

Kibana 是一个开源分析和可视化平台&#xff0c;旨在与 Elasticsearch 协同工作。 你使用 Kibana 搜索&#xff0c;查看和与存储在 Elasticsearch 索引中的数据进行交互。 你可以轻松执行高级数据分析&#xff0c;并在各种图表&#xff0c;表格和地图中可视化你的数据。 官方链…

文件批量下载方法 文件批量下载工具

软件版本&#xff1a;Internet Download Manager 在当今数字化时代&#xff0c;我们日常使用电脑进行各种工作和娱乐活动。有时候&#xff0c;我们需要从互联网上下载大量文件&#xff0c;例如电影、音乐、文档等。在这种情况下&#xff0c;手动逐个下载文件将变得繁琐而耗时。…

梯度下降法求函数的解

题目 例如 y x^ 5 e^x3x−3&#xff0c;求解y 0的解 问题分析 首先要构造y 0的损失函数&#xff0c;让这个损失函数是凸的&#xff0c;也就是可以有最优解&#xff0c;并且是可到的&#xff0c;比较容易想到的是mse平方误差&#xff0c;我们要让y和0之间绝对误差最小。lo…

变压器铜铝材质分析仪技术参数

一、主要技术指标 1.输入特性 有源部分&#xff1a; 电压测量范围&#xff1a;0~10V 电流测量范围&#xff1a;0~10A 无源部分&#xff1a; 电压测量范围&#xff1a;0~750V 宽量限&#xff08;可以外接电压互感器&#xff09;。 电流测量范围&#xff1a;0~100A内部自动…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 28 日论文合集)

文章目录 一、检测相关(6篇)1.1 Detector-Free Structure from Motion1.2 Irregular Change Detection in Sparse Bi-Temporal Point Clouds using Learned Place Recognition Descriptors and Point-to-Voxel Comparison1.3 Transferability Metrics for Object Detection1.4 …

【超全面】Linux嵌入式干货学习系列教程

文章目录 一、前言二、Linux基础篇三、数据结构与算法基础三、Linux应用篇四、Linux网络篇五、ARM篇六、Linux系统移植篇七、Linux驱动篇八、Linux特别篇九、Linux项目篇 一、前言 博主学习Linux也有几个月了&#xff0c;在这里为广大朋友整理出嵌入式linux的学习知识&#xff…

精彩回顾 | 迪捷软件亮相2023飞机航空电子国际论坛

2023年6月29日&#xff0c;2023&#xff08;第十二届&#xff09;飞机航空电子国际论坛&#xff08;以下简称论坛&#xff09;在上海市圆满落幕。论坛由中国航空学会、中国航空研究院、中航机载系统有限公司共同主办&#xff0c;中国航空无线电电子研究所、航空电子系统综合技术…

SpringCloud-Gateway网关全悉

1&#xff09;概述 使用说明文档 其他版本api文档请自由查阅&#xff1a; https://spring.io/projects/spring-cloud-gateway#learn 1.1&#xff09;是什么 Cloud全家桶中有个很重要的组件就是api网关&#xff0c;在1.x版本中都是采用的Zuul网关&#xff0c;但在2.x版本中&a…

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(下篇)

深入探索Logback日志框架的原理分析和开发实战技术指南&#xff08;下篇&#xff09; 根节点configuration包含的属性基本参数详解子节点介绍设置上下文名称<contextName>使用案例 设置变量属性值<property>获取时间戳字符串<timestamp>设置loggerroot根节点…

CDH 之 Hive 中文乱码平定通用法则

一、乱象 1.1 中文注释乱码 hive> DESCRIBE test; OK # col_name data_type comment id string ??ID ?? pcs string ????? …