Flask Cookie和Session的使用

简介: Flask Cookie和Session的使用

Cookie和Session的概念

Cookie

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

cookie 存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过 4kb

因此使用 cookie 只能存储一些小量的数据。

<br/>

Session

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

cookie 和 session 结合使用:cookie 和 session 的使用已经出现了一些非常成熟的方案。一般有两种存储方式

  • 存储在服务端:通过 cookie 存储一个 session_id,然后具体的数据则保存在 session 中。如果用户已经登录,则服务器会在 cookie 中保存一个 session_id,下次再请求的时候,会把该 session_id 携带上,服务器根据session_id 在 sesson 库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做 server side session.
  • 将 session 数据加密,然后存储在cookie中。这种专业术语叫做 client side session。Flask采用的就是这种方式,但是也可以替换成其它方式。

<br/>

Cookie的使用

在 Flask 中利用 make_response() 函数创建出来的 Response 对象就可以对 Cookie 进行相关操作

Response对象的 set_cookie() 方法参数详情

def set_cookie(
        self,
        key,
        value="",
        max_age=None,    
        expires=None,
        path="/",
        domain=None,
        secure=False,
        httponly=False,
        samesite=None,
    ):

常用参数说明

  • key cookie的键
  • value cookie的值
  • max_age 设置 cookie 存储多久 单位秒,默认则是一次浏览器会话,关闭浏览器就没有了。
  • expires 设置 cookie 过期日期,必须是一个 datetime 对象类型或者 UNIX 时间戳
  • path 限制cookie到一个给定的路径,默认情况下它将属于整个域名下

<br/>

如果 max_ageexpires 都设置了,则以 max_age 参为准
若没有设置过期时间,则默认为浏览会话结束,即关闭浏览器(是关闭浏览器,不是关闭页面)时过期

<br/>

Cookie的设置与获取

from flask import Flask, make_response, request

app = Flask(__name__)


# 设置Cookie
@app.route("/set_cookie")
def set_cookie():
    resp = make_response('success')

    resp.set_cookie("name", "hui")
    resp.set_cookie("age", "21")

    return resp

# 获取Cookie
@app.route("/get_cookie")
def get_cookie():
    name = request.cookies.get("name")
    age = request.cookies.get("age")

    resp = f"name={name}, age={age}"
    return resp


if __name__ == "__main__":
    app.run()

<br/>

使用 make_response() 函数来创建 Response 响应对象,然后使用 set_cookie() 方法设置cookie数据

获取 Cookie 则是用 request.cookies.get()

设置Cookie

<br/>

获取Cookie

<br/>

设置过 Cookie 了,下次请求浏览器会自动携带 Cookie 信息。因此在request.cookies 获取cookie信息

查看Cookie过期时间

浏览会话结束

<br/>

Cookie设置过期时间

from datetime import datetime, timedelta
from flask import Flask, make_response, request

app = Flask(__name__)


@app.route("/set_expires")
def set_cookie_expires():
    resp = make_response("设置cookie过期时间")

    # 设置1分钟后过期
    resp.set_cookie("sex", "male", max_age=60)

    # 设置一天后过期
    expires_date = datetime.now() + timedelta(days=1, hours=-8)
    resp.set_cookie("city", "GanZhou", expires=expires_date)

    return resp

<br/>

如果使用 expires,浏览器则会默认使用 格林尼治 时间,即在设置的时间自动 +8小时,因此我们在设置过期时间时需要减掉这8小时才符号我们的预期。

datetime 对象在进行时间间隔运算不能直接加减要借助 timedelta

<br/>

一分钟后过期

<br/>

一天后过期

<br/>

删除Cookie

from flask import Flask, make_response

app = Flask(__name__)


@app.route("/del_cookie")
def del_cookie():
    resp = make_response("del cookie")
    resp.delete_cookie("name")
    return resp

其删除 cookie 其实就是把过期设置成 max_age=0, expires=0

看看 Flask 源码,就可得知

    def delete_cookie(self, key, path="/", domain=None):
        """Delete a cookie.  Fails silently if key doesn't exist.

        :param key: the key (name) of the cookie to be deleted.
        :param path: if the cookie that should be deleted was limited to a
                     path, the path has to be defined here.
        :param domain: if the cookie that should be deleted was limited to a
                       domain, that domain has to be defined here.
        """
        self.set_cookie(key, expires=0, max_age=0, path=path, domain=domain)

<br/>

Session的使用

Session的设置与获取

"""
Author: Hui
Desc: { Flask session的使用 }
"""
from flask import Flask, session

app = Flask(__name__)
app.config["SECRET_KEY"] = "it hui"


# flask默认吧session保存在cookie中
@app.route("/index")
def index():
    name = session.get("name")
    return "hello {}".format(name)


@app.route("/login")
def login():
    session["name"] = "hui"
    return "set session name"


if __name__ == "__main__":
    app.run()

<br/>

设置session时记得添加密钥配置

app.SECRECT_KEY = "it hui"

如不设置则会报如下错误

RuntimeError: The session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.

<br/>

测试上面的程序,先访问 127.0.0.1:5000/index

index页面

<br/>

然后访问 127.0.0.1:5000/login 设置 session

设置Session

<br/>

然后再访问 127.0.0.1:5000/index 看看

设置session后的index

<br/>

Flask 默认把 session 保存在 cookie

当前设置了一个 keyname 的,值为 huisession 信息,来查看浏览器 Cookie 信息

查看浏览器Cookie信息

只是 session 信息内容被加密了,因为要用到 SECRET_KEY 信息来加密 session 信息, 所以设置 session 时要设置密钥 SECRET_KEY因为 Flask 的 session 信息存储在本地 cookie 中,是可以被篡改的,为了保证安全性,一旦被修改,Flask 则认为这是一个无效的 session 信息

<br/>

Session设置过期时间

Flask的 session 默认过期时为会话结束,如果开启会话过期时间 (session.permanent=True),默认过期时间为 一个月,可以通过 permanent_session_lifetime Flask的配置信息来设置 session 的过期时间

从Flask源码就可得知

#: This attribute can also be configured from the config with the
    #: ``PERMANENT_SESSION_LIFETIME`` configuration key.  Defaults to
    #: ``timedelta(days=31)``
    permanent_session_lifetime = ConfigAttribute(
        "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta
    )

设置过期时间使用 timedelta 对象

设置了 session.permanent = True

设置session.permanent=True

<br/>

"""
Author: Hui
Desc: { Flask session的使用 }
"""
from datetime import timedelta
from flask import Flask, session

app = Flask(__name__)
app.config["SECRET_KEY"] = "it hui"

# 设置session过期时间
app.permanent_session_lifetime = timedelta(seconds=60)


# flask默认把session保存在cookie中
@app.route("/index")
def index():
    name = session.get("name")
    age = session.get("age")
    return f"name={name}, age={age}"


@app.route("/age")
def set_session():
    session["age"] = 21
    return "set session age"


@app.route("/login")
def login():
    session["name"] = "hui"
    session.permanent = True
    return "set session name"


if __name__ == "__main__":
    app.run()

指定 session 过期时间为1分钟

app.permanent_session_lifetime = timedelta(seconds=60)

设置session指定过期时间

<br/>

删除session

@app.route("del_session")
def del_session():
    session.pop("name")
    # session.clear() # 删除session所有信息
    return "del session name"

<br/>

源代码

源代码已上传到 Gitee HuiDBK/FlaskBasic - 码云 - 开源中国 (gitee.com),欢迎大家来访。

✍ 码字不易,还望各位大侠多多支持❤️。

<br/>

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。
相关文章
|
3月前
|
存储 编解码 应用服务中间件
会话跟踪技术(Session 以及Cookie)
会话跟踪技术(Session 以及Cookie)
|
3月前
|
存储 前端开发 小程序
表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序
表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序
|
7天前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
4月前
|
存储 Web App开发 安全
Cookie和session 及Web相关工具
Cookie和session 及Web相关工具
|
25天前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
42 1
|
27天前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
31 1
|
1月前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
26 2
|
1月前
|
存储 缓存 安全
Cookie和Session
【8月更文挑战第20天】
15 1
|
1月前
|
存储 JSON JavaScript
震撼!Cookie、Session、Token、JWT 终极对决:揭开 Web 认证的神秘面纱!
【8月更文挑战第13天】Web 开发中,Cookie、Session、Token 和 JWT 常混淆。Cookie 是服务器给客户端的小信息片,如登录状态,每次请求都会返回。Session 则是服务器存储的用户数据,通过 Session ID 追踪。Token 类似通行证,证明客户端身份且可加密。JWT 是结构化的 Token,含头部、载荷及签名,确保数据完整性和安全性。
39 4
|
20天前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
65 0