Python Flask 中 Cookie 与 Session 的区别及实战应用

夏知夏
夏知夏
发布时间:2026-10-12| 5人浏览过
原创

HTTP 协议本身是无状态的,Web 框架需要借助存储机制维持用户会话。在 Flask 中,Cookie 将数据直接保存在浏览器端,而 Session 采用“服务端存储数据 + 浏览器保存加密标识”的模式,安全性更高。本文详述两者的核心差异,并提供从零搭建虚拟环境、编写路由读写数据的完整步骤与安全配置指南。

核心原理对比

HTTP 请求默认不保留上下文信息。访问网页时,服务器无法仅凭连接判断“你是谁”。Cookie 是由服务器生成、由浏览器缓存的键值对数据,属于明文存储于客户端,容易被篡改且容量受限。Session 则遵循“前后端分离”思路:敏感数据(如登录状态、权限标识)存放在服务端,浏览器仅持有经过签名或加密的 Session ID 存放在 Cookie 中。双方校验该标识即可恢复会话,兼顾了安全性与扩展性。

环境准备与安装

在开始编写逻辑前,需先隔离项目依赖,确保运行环境干净。

第1步:创建虚拟环境

目的:避免全局包冲突。
入口:系统终端或命令行。
动作:执行以下命令创建并切换至项目目录。

mkdir myproject
cd myproject
python3 -m venv venv

第2步:激活虚拟环境

目的:使后续的包安装指令作用于隔离空间。
入口:同上终端。
动作:Linux/macOS 执行 . venv/bin/activate;Windows 执行 venv\Scripts\activate。激活成功后命令行会显示 (venv) 前缀。

第3步:安装 Flask 框架

目的:获取路由管理与模板渲染核心库。
入口:终端命令行。
动作:执行 pip install Flask 完成安装。

Cookie 的读写操作与验证

Cookie 适用于非敏感的基础状态记录,如主题偏好或临时身份标识。下面演示如何通过响应对象写入 Cookie,并在请求阶段读取验证。

from flask import Flask, Response, request
app = Flask(__name__)

@app.route("/set_cookie")
def set_cookie():
    response = Response("set cookie success")
    response.set_cookie("user_id", "123")
    return response

@app.route("/get_cookie")
def get_cookie():
    cookies = request.cookies
    if cookies.get("user_id") == "123":
        return "尊敬的用户你好,你的cookies是" + str(cookies)
    else:
        return "你不是VIP,请先获取身份"

if __name__ == "__main__":
    app.run(debug=True, port=5000)

运行上述脚本后,首先访问 /get_cookie 路径,因浏览器尚未携带对应数据,将返回未获取身份的提示。随后访问 /set_cookie 路径,服务端会将指定键值写入响应头。之后再次刷新或访问 /get_cookie,浏览器自动携带该 Cookie,即可成功读取并显示已登录状态。

Session 的配置与使用流程

Session 更适合保存登录凭证、购物车或高频交互状态。使用前提是配置密钥,用于对传输的 Session ID 进行签名防篡改。

from flask import Flask, session
app = Flask(__name__)
# 必须配置长随机字符串作为密钥,防止会话伪造
app.config["SECRET_KEY"] = "your-random-secret-key-here"

@app.route("/set_session")
def set_session():
    session["user_name"] = "zhuxiaoxiao"
    return "设置session成功" + session["user_name"]

@app.route("/home")
def home():
    if session.get("user_name") == "zhuxiaoxiao":
        return "尊敬的用户,登录成功"
    else:
        return "请先登录好吗?"

if __name__ == "__main__":
    app.run(debug=True, port=5000)

操作逻辑与 Cookie 类似,但底层介质不同。首次访问 /home 时,由于没有有效的签名标识,请求会被拒绝。访问 /set_session 后,服务端会将用户名写入内部存储,并向客户端返回加密后的标识 Cookie。后续请求只要带上此标识,即可通过 /home 的状态检查。务必将示例中的占位密钥替换为高强度随机字符串,否则会导致安全警告或会话失效。

常见配置排错与注意事项

  • 缺失密钥报错:启动 Session 相关路由时若抛出 RuntimeError: The session is unavailable because no secret key was set,请检查是否在 app.config 中正确赋值了 SECRET_KEY。
  • 跨域与路径限制:set_cookie 支持 path 参数限定有效路径。若发现 Cookie 无法在特定子路由下读取,请确认是否未设置 path="/" 导致作用域被截断。
  • 调试模式警告:代码末尾的 debug=True 仅限本地开发使用。部署至生产环境前务必关闭,并启用 HTTPS 以防止标识在网络传输中被拦截。

以上就是 Python Flask 中 Cookie 与 Session 区别及实战应用的详细内容,更多关于 Python Web 开发基础配置的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。