[Flask] Flask会话

由于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':# 如果用户名和密码正确,将用户名写入Cookieresponse = make_response('登录成功!')  # 获取response对象# set_cookie内的第一个参数是设置cookie的key,第二个参数是用来设置cookie的valueresponse.set_cookie('username', username)  # 将用户名写入Cookiereturn 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,即删除Cookieresponse.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':# 如果用户名和密码正确,将用户名写入Cookieresponse = make_response('登录成功!')  # 获取response对象# set_cookie内的第一个参数是设置cookie的key,第二个参数是用来设置cookie的valueresponse.set_cookie('username', username)  # 将用户名写入Cookiereturn response  # 返回response对象return render_template('login.html')  # 渲染表单页面@app.route('/logout')
def logout():response = make_response('退出登录!')# response.delete_cookie('username')# 设置Cookie过期时间为0,即删除Cookieresponse.set_cookie('username', '', expires=0)return responseif __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  # 写入sessionreturn 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  # 写入sessionreturn 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.hqwc.cn/news/1795.html

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

相关文章

哈工大计算机网络传输层协议详解之:可靠数据传输的基本原理

哈工大计算机网络传输层协议详解之&#xff1a;可靠数据传输的基本原理 哈工大计算机网络课程传输层协议详解之&#xff1a;流水线机制与滑动窗口协议哈工大计算机网络课程传输层协议详解之&#xff1a;TCP协议哈工大计算机网络课程传输层协议详解之&#xff1a;拥塞控制原理剖…

MyBatisPlus基础功能使用

文章目录 MyBatisPlus基础功能CRUDBaseMapperServiceImpl 条件构造器注解一对多、多对一映射 MyBatisPlus基础功能 CRUD BaseMapper BaseMapper 接口是 MyBatis-Plus 提供的一个基础 Mapper 接口&#xff0c;它定义了一系列的通用数据库操作方法&#xff0c;包括插入、更新、…

【C/C++】使用类和对象 练习EasyX图形库

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

黑马微信小程序-实现本地服务九宫格并展示商品列表

一、九宫格实现 1.获取数据 1.1准备接口 黑马接口&#xff1a;https://applet-base-api-t.itheima.net/categories 说明&#xff1a;这是获取九宫格的数据接口 1.2使用接口 说明&#xff1a;声明变量获取数据。 getGridList() {wx.request({url: https://applet-base-api-t.…

ECS云服务器U实例评测,可以免费体验哦

目录 一、ECS云服务器U实例介绍 话题一、U实例使用体感如何&#xff0c;是否和主售型实例有区别&#xff0c;具体体现在哪里&#xff1f; 话题二、结合相关数据材料&#xff0c;对您感兴趣的场景 话题三、使用u实例是否为您的云上业务或者测试项目提供了帮助支持&#xff1…

Qgis加载在线XYZ瓦片影像服务的实践操作

目录 背景 一、XYZ瓦片相关知识 1、xyz瓦片金字塔 2、 瓦片编号 3、瓦片访问 二、在Qgis中加载在线地图 1、Qgis版本 2、瓦片加载 3、地图属性预览 总结 背景 在做电子地图应用的时候&#xff0c;很常见的会提到瓦片&#xff08;tile&#xff09;的概念&#xff0c;瓦片…

Redis系列 | 分类树查询功能如何从2s优化到0.1s

大家好&#xff0c;今天我们继续来分享一个在项目开发过程中遇到的实际问题&#xff0c;这里也来梳理并总结一下我们是如何对它进行持续优化的&#xff0c;希望能对大家有所帮助。 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在一些电商系统中…

国产chatgpt:基于chatGLM微调nlp分类任务

文章目录 一、源码网址1. 硬件设施&#xff1a;2. INT4 量化示例 二、重要的开源社区功能&#xff1a;网址&#xff1a;使用方法&#xff1a;利用方法&#xff1a;对 NLP 工作者的作用&#xff1a;对大模型工程师的用处&#xff1a; 三、重要的开源库四、提示词工程五、进行分类…

线性代数笔记整理

文章目录 1 行列式2 矩阵&#xff08;本质是数表&#xff09;3 方程组的解4 向量5 矩阵的特征值和特征向量6 相似矩阵和相似对角化7 合同对角化8 二次型及其标准型 1 行列式 2 矩阵&#xff08;本质是数表&#xff09; 3 方程组的解 4 向量 5 矩阵的特征值和特征向量 6 相似矩阵…

从0到1精通自动化测试,pytest自动化测试框架,skip跳过用例(八)

一、前言 pytest.mark.skip可以标记无法在某些平台上运行的测试功能&#xff0c;或者希望自己失败的测试功能 skip意味着只有在满足某些条件时才希望测试通过&#xff0c;否则pytest应该跳过运行测试。 常见示例是在非Windows平台上跳过仅限Windows的测试&#xff0c;或跳过测…

pytorch搭建AlexNet网络实现花分类

pytorch搭建AlexNet网络实现花分类 一、AlexNet网络概述分析 二、数据集准备下载划分训练集和测试集 三、代码model.pytrain.pypredict.py 一、AlexNet网络 概述 使用Dropout的方式在网络正向传播过程中随机失活一部分神经元&#xff0c;以减少过拟合 分析 对其中的卷积层、…

MyCat01——如何实现MySQL中的主从复制

1 问题 数据对于我们来说是一项最重要的资产&#xff0c;因为数据丢失带来的损失&#xff0c;对于一家公司来说&#xff0c;有时也是毁灭性的。 那么如何确保数据安全&#xff0c;不因断电或系统故障带来数据丢失呢&#xff1f; 当用户增加&#xff0c;对数据库的访问量也随…