一、cookie和session介绍

cookie

在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。

session

session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session是存储在服务器上。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,存储一些session信息还是绰绰有余的。

cookie和session结合使用

web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。

2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。

二、Flask中使用cookie和session

cookie

在Flask中操作cookie,是通过response对象来操作,可以在response返回之前,通过response.set_cookie来设置,这个方法有以下几个参数需要注意:

  • key:设置的cookie的key。
  • value:key对应的value。
  • max_age:设置cookie的过期时间,单位秒,如果不设置,则浏览器关闭后cookie就会自动过期。
  • expires:过期时间,应该是一个datetime类型。
  • domain:该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com。
  • path:该cookie在哪个路径下有效。

使用:

  • 设置:resp.set_cookie(key, value, max_age=整数)
  • 获取:request.cookies.get(key, '默认值')
  • 删除:resp.delete_cookie(key)
from flask import Flask, make_response, request

app = Flask(__name__)

# 设置cookie
@app.route("/set/")
def cookie_set():
resp = make_response("设置cookie")
# 设置一个cookie,其key为token,value为asd123
# max_age:指定cookie过期时间段。单位为秒。
# expires:指定cookie过期时间点。
resp.set_cookie("token", "asd123", max_age=3600)
return resp # 获取cookie
@app.route("/get/")
def cookie_get():
return request.cookies.get("token", "cookie not exist") # 删除cookie
@app.route("/del/")
def cookie_delete():
resp = make_response("删除cookie")
resp.delete_cookie("token")
return resp if __name__ == '__main__':
app.run()

需要说明的是,删除cookie后,若不关闭浏览器,我们仍能查看到该cookie,但是该cookie的值已被清空,并且到期时间变为了创建时间

session

Flask中默认的session机制是将session信息加密,然后存储在cookie中。通过from flask import session ,我们可以对session进行操作。

设置session

# session通过密钥对数据进行签名以加密数据,因此,设置session前得先设置一个密钥。密钥可以随便输入。
app.secret_key = 'dsafdsaf' @app.route("/sset/")
def session_set():
# session可以设置多个,但是加密后在cookie中查看只会显示一个session
session["username"] = "admin"
session["password"] = "admin"
return "session设置成功"

查看cookie,可以看到session的值是加密处理cookie后的值。使用session对象存储的cookie,用户可以看到加密后的值,但是不能修改。因为session中的内容使用密钥进行签名加密,一旦数据被篡改,签名的值也会变化,这样在读取时,就会验证失败,对应的session值也会随之失效。所以,除非用户知道密钥,否则无法对cookie值进行修改。

获取session

@app.route("/sget/")
def session_get():
username = session.get("username")
password = session.get("password")
return F"{username,password}"

 删除session

@app.route("/sdel/")
def session_del():
# 删除指定session,第二个参数设置为None,即使删除不存在的键也不会报错
session.pop("username", None)
# 删除所有session
# session.clear()
return "删除成功"

附码:

from flask import Flask, make_response, request, session

app = Flask(__name__)

# 设置cookie
@app.route("/set/")
def cookie_set():
resp = make_response("设置cookie")
# 设置一个cookie,其key为token,value为asd123
# max_age:指定cookie过期时间段。单位为秒。
# expires:指定cookie过期时间点。
resp.set_cookie("token", "asd123", max_age=3600)
return resp # 获取cookie
@app.route("/get/")
def cookie_get():
return request.cookies.get("token", "cookie not exist") # 删除cookie
@app.route("/del/")
def cookie_delete():
resp = make_response("删除cookie")
resp.delete_cookie("token")
return resp # 设置session
# session通过密钥对数据进行签名以加密数据,因此,设置session前得先设置一个密钥。密钥可以随便输入。
app.secret_key = 'dsafdsaf' @app.route("/sset/")
def session_set():
# session可以设置多个,但是加密后在cookie中查看只会显示一个session
session["username"] = "admin"
session["password"] = "admin"
return "session设置成功" # 获取session
@app.route("/sget/")
def session_get():
username = session.get("username")
password = session.get("password")
return F"{username,password}" # 删除session
@app.route("/sdel/")
def session_del():
# 删除指定session,第二个参数设置为None,即使删除不存在的键也不会报错
session.pop("username", None)
# 删除所有session
# session.clear()
return "删除成功" if __name__ == '__main__':
app.run()

本文参考:https://www.cnblogs.com/wangjintao-0623/p/9598827.html

Flask_cookie和session(五)的更多相关文章

  1. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  2. Python接口测试,Requests模块讲解:GET、POST、Cookies、Session等

    文章最下方有对应课程的视频链接哦^_^ 一.安装.GET,公共方法 二.POST 三.Cookies 四.Session 五.认证 六.超时配置.代理.事件钩子 七.错误异常

  3. jpa 解决org.hibernate.lazyinitializationexception could not initialize proxy - no session

    org.hibernate.LazyInitializationException: could not initialize proxy [org.alan.entity.SysUser#1] - ...

  4. ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  5. ASP.NET WebApi 基于分布式Session方式实现Token签名认证(发布版)

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  6. cookie与session django中间件

    目录 一.什么是cookie 二.django中操作cookie 2.1 如何操作cookie 2.2 操作cookie 三.什么是session 四.django中操作session 4.1 创建c ...

  7. 会话技术——Cookies和Session详解

    会话技术 (一) 概述.用途以及分类 (1) 基本概述 概述:会话是浏览器和服务器之间的多次请求和响应 也就是说,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和 ...

  8. day 62.3 Django基础八之cookie和session

    Django基础八之cookie和session   本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx ...

  9. day 73 Django基础八之cookie和session

      Django基础八之cookie和session   本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 x ...

随机推荐

  1. HTML DOM 对象 - 方法和属性

    一些常用的 HTML DOM 方法: getElementById(id) - 获取带有指定 id 的节点(元素) appendChild(node) - 插入新的子节点(元素) removeChil ...

  2. 阿里云RDS备份 恢复到本地

    目录 一.恢复准备 二.具体操作 一.恢复准备 阿里云RDS默认配置了全备份+binlog,可以精准恢复到某个时间点上. 可以下载备份的包到本地,进行本地恢复,要预留好本地的数据库容量和cpu等规格, ...

  3. Solon 1.6.6 发布,细节打磨

    Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 增加 @Inject("ds1") BeanWrap bw 模式注入 @Configuration public c ...

  4. linux 编程随笔

    Linux 命令: 在linux 系统中,所有的命令都是人为编写的程序,如 who 和 ls ,而且绝大多数都是C写的.在Linux 中增加新的命令是很简单的事,把程序的可执行文件放到以下目录就可以了 ...

  5. 删除空行(嵌套)(Power Query 之 M 语言)

    数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...

  6. Log4j2又爆雷!2.16.0存在DOS风险,升级2.17.0可解决

    本以为,经过上周的2.16.0版本升级,Log4j2的漏洞修复工作,大家基本都要告一段落了. 万万没想到,就在周末,Log4j官方又发布了新版本:2.17.0 该版本主要修复安全漏洞:CVE-2021 ...

  7. 在eclipse打开jsp文件变成文本的解决:

    在eclipse打开jsp文件变成文本的解决: ------原因:可能是不小心删除某些组件等等一些操作 1,考虑一下是否还有插件jsp 编辑器组件 选择内部编辑器[在下面选择 JSP Editor]- ...

  8. CF1547B Alphabetical Strings 题解

    Content 我们有一个空的字符串,第 \(i\) 次操作我们可以将字母表中第 \(i\) 个字母加入字符串的最前面或最后面.我们称一个长度为 \(n\) 的字符串是合法的,当且仅当这个字符串可以通 ...

  9. JVM 常见面试题指南

    基础 1. JDK.JRE.JVM的关系是什么? 什么是 JVM? 英文名称 (Java Virtual Machine ),就是JAVA 虛拟机,它只识别 .class 类型文件,它 能够将 cla ...

  10. C语言获取字符年月日时分秒毫秒

    概述 本文演示环境: Windows10 使用C语言获取年月日时分秒毫秒, 代码 #include <iostream> #include <string> #include ...