[Flask] Cookie与Session

news2024/10/7 8:22:29

由于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/716335.html

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

相关文章

Linux——进程信号(上)

目录 前文 一&#xff0c;什么是进程信号 二&#xff0c;信号的产生 2.1 通过按键终端产生信号 2.2 调用系统函数向进程发信号 2.3 由软条件产生信号 2.4 硬件异常产生信号 总结 前文 上文主要讲了一下进程间用管道通信的相关知识&#xff0c;本文主要带领大家深度认识一…

cpolar在windows系统下的关闭方法

计算机&#xff0c;右键-管理 管理–服务–cpolar service&#xff0c;停止服务

InfluxDB 压力测试

一、基础环境 1. InfluxDB V1.7.8&#xff0c;预置了10.3G 数据做为初始数据 &#xff08;调整了 部分参数&#xff0c;否则数据库动不动就崩溃&#xff09; 2. 模拟141个设备&#xff0c;共计1390个点位 3. 服务器配置 128G内存&#xff0c;2.4Ghz CPU&#xff0c;虚拟机 …

前端十万个为什么——软件设计的架构模式

&#x1f600;博主&#xff1a;小猫娃来啦 &#x1f600;文章核心&#xff1a;软件设计的架构模式 上篇文章&#xff0c;我们聊了一下前端的普遍性问题以及解决策略。书接上文&#xff0c;我们今天聊聊软件设计的架构模式。 在正文开始前&#xff0c;先思考几秒&#xff1a;为…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(二)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践&#xff0c;帮助开发组织减少发布的软件中的漏洞数量&#xff0c;减少利用未检测到或未解决的漏洞的潜在影响&#xff0c;从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

想学会如何翻译pdf中的英文?让我教你三招

曾经有一个名叫小明的年轻人&#xff0c;他是一名热爱阅读的书虫。每天&#xff0c;他都会沉浸在大量的pdf文档中&#xff0c;探索着各种知识的海洋。然而&#xff0c;有时候他遇到了一些困扰&#xff0c;因为有些pdf文档并不是他熟悉的语言书写的。小明很苦恼&#xff0c;他希…

python接口自动化(十四)--session关联接口(详解)

简介 上一篇cookie绕过验证码模拟登录博客园&#xff0c;但这只是第一步&#xff0c;一般登录后&#xff0c;还会有其它的操作&#xff0c;如发帖&#xff0c;评论等等&#xff0c;这时候如何保持会话呢&#xff1f;这里我以jenkins平台为例&#xff0c;给小伙伴们在沙场演练一…

vue3在浏览器段展示海康监控视频

一、需求 需要在浏览器点击查看海康的监控视频 二、最后成果展示 插件下载地址&#xff1a;https://download.csdn.net/download/xm_w_xm/87995593 三、思路和方法 3.1 首先安装插件&#xff0c;可以在上面的地址中下载安装&#xff0c;建立一个dom <div id"playW…

利用Dockerfile构建带sshd、jdk服务的自定义镜像

什么是Dockerfile? Dockerfile 是一个文本格式的配置文件&#xff0c; 用户可以使用 Dockerfile 来快速创建自定义的镜像 dockerfile 的基本结构 Dockerfile 由一行行命令语句组成&#xff0c;并且支持以 # 开头的注释行。 一般的&#xff0c;Dockerfile 分为四部分&#…

SpringCloud入门实战(十一)-Spring Cloud Stream消息驱动概述

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

聚焦云原生安全攻防|构建纵深防御的运行时威胁检测体系

7月2日&#xff0c;诸子云北京分会研讨会活动—网络安全攻防对抗在北京成功举办。 作为国内云原生安全领导厂商&#xff0c;安全狗也参与此次活动。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;成立于2013年&#xff0c;致力于提供云安全、&…

Scenario Runner (CARLA)

1. How to run scenarios —Type 2. How to run scenarios —Functionalities

系统提权与数据窃取

系统提权与数据窃取 一、后渗透二、后渗透的技术2.1、提权2.2、横向移动2.3、持久化2.4、数据窃取2.5、漏洞利用 三、meterpreter后渗透3.1、靶机权限提升3.1.1、windows内核/服务漏洞3.1.2、bypassUAC3.1.2.1、bypassuac 进程注入3.1.2.2、bypassuac_injection 内存注入3.1.2.…

Android Studio实现内容丰富的安卓医院医生招聘平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号120 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查…

软件设计师(九)数据库技术基础

数据库技术是研究数据库的结构、存储、设计、管理和应用的一门软件学科 一、基本概念 1、数据库和数据库系统 数据库系统&#xff08;DataBase System&#xff0c;DBS&#xff09;是一个采用了数据库技术&#xff0c;有组织地、动态地存储大量数据&#xff0c;方便多用户访问…

公众号授权登录h5

公众号授权登录h5 . 前几天一个月薪35k的兄弟&#xff0c;给我推了一个人工智能学习网站&#xff0c;看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有&#xff0c;很详细&#xff0c;分享给大家。大家及时保存&#xff0c;说不定啥时候就没了。 . 步骤 …

认识JavaScript

大家好,今天我们来认识一下JavaScript相关内容 目录 &#x1f437;1.JavaScript是什么&#x1f437;2.JavaScript发展史&#x1f437;3.JavaScript 和 HTML 和 CSS 之间的关系&#x1f437;4.JavaScript 运行过程&#x1f437;5.JavaScript 的组成&#x1f437;6.用JavaScript写…

JavaScript 实现一键复制(id,账号)

文章目录 HTML准备JavaScript 逻辑css 在前端有很多的时候需要一键复制账号&#xff0c;密码等&#xff0c;比如QQ的复制QQ账号&#xff0c;一些程序应用的个人信息页&#xff0c;都会有一键复制这个功能&#xff0c;下面给大家分享一下一键复制的实现方法 HTML准备 先提前准备…

【Linux修炼】开发工具使用

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…