Django会话技术详解:Cookie、Session与Token实战指南

一只小鹿
一只小鹿
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析Django框架中的会话技术,涵盖Cookie、Session与Token三种核心机制。详细阐述客户端与服务端会话的区别、过期时间配置、数据库存储策略及Token生成算法。结合用户注册、登录、登出等典型场景,提供基于Response和Request对象的API操作示例,并探讨利用摘要算法保障数据安全的最佳实践。

Django会话技术概述

本文通过具体实例解析Django框架中的会话技术,旨在为开发者提供清晰的参考与实操指导。

会话技术概述

Cookie客户端会话技术

1、Cookie

  • Cookie属于客户端会话技术,其数据直接存储于用户浏览器端。
  • 数据以键值对(key-value)的形式进行存储与管理。
  • 所有Cookie的操作均需通过Response对象来实现。
  • 典型场景回顾
    • 典型应用场景包括购物车数据的持久化存储。
    • 以及用户登录信息的保持。
  • Cookie支持配置过期时间,以控制数据的生命周期。
  • Cookie清除策略详解
    • 默认情况下,当用户关闭浏览器时,Cookie会被自动清除。
    • 可以通过配置来设定Cookie的过期时间。
    • 设置max-age=0时,Cookie将在关闭浏览器后失效。
    • 设置max-age=None时,Cookie将保持永久有效。
    • 设置max-age为整数时,单位为秒,表示经过指定秒数后失效。
    • expires属性用于设置过期时间,其功能与max-age基本一致。
  • 用户登出操作实质上就是清除存储在客户端的Cookie(如令牌)。

Session服务端会话技术

2、Session

  • Session属于服务端会话技术,数据主要存储于服务器端。
  • Session依赖于Cookie进行标识传递
    • 系统将在数据库中生成的session_key作为sessionid,并存储于客户端的Cookie中,以此建立关联。
  • Session数据存储在数据库中,并进行了基础的数据安全处理,例如采用base64编码。

Token手动会话实现

3、Token

  • Token同样属于服务端会话技术的一种实现方式。
  • 它相当于手动实现的Session机制,由开发者自行控制逻辑。
  • Session值应该是唯一的
    • 必须通过特定算法确保Token的唯一性。
    • 生成Token时可结合时间因素。
    • 可结合用户IP地址。
    • 可结合域名信息。
    • 可结合网卡MAC地址。
    • 引入随机数以增加不可预测性。

会话技术解决痛点与用户管理

4、解决痛点

  • 会话技术旨在解决HTTP短连接无法保存用户状态的问题。
  • 通过会话机制,有效延长了请求的生命周期,实现了状态保持。
  • 用户管理实例分析
    • 以用户注册为例,流程如下:
    • 将用户数据存储到数据库中。
    • 数据安全策略实施
      • 密码对任何人来说都应当是不透明的,需进行加密处理。
    • 用户登录流程:
    • 将用户提交的身份信息与数据库内存储的信息进行校验。
    • 若返回不成功结果,需刻意模糊错误概念,避免泄露具体失败原因(如区分密码错误与用户不存在)。
    • 获取用户信息:
    • 根据用户的唯一标识,从数据库中获取对应的用户数据。
    • 用户退出流程:
    • 清除令牌(Token)。
    • 清理Cookie、Session或Token,确保会话彻底结束。

数据安全与摘要算法

5、数据安全

  • 具体策略执行
    • 服务器的数据对任何人来说都应该是不可见的(不透明)。
    • 可以使用常见的摘要算法对数据进行摘要处理,如md5、sha等。
    • 在所有数据验证的地方都加上安全保护措施,防止篡改。

6、摘要算法

  • hashlib库的使用
    • 常用算法包括sha系列。
    • 以及md5算法。
    • 用来验证数据完整性(不被篡改)
      • 核心特性:哪怕【消息原文】被改动一丁点,【篡改版消息生成的消息摘要】都会与【原始消息所生成的消息摘要】大相径庭。
    • 统一输出格式规范
      • 输出默认都是128位二进制数(针对MD5)。
      • 通常表示为32位16进制数。
    • 摘要算法具有单向不可逆的特性。

UUID唯一标识生成

7、UUID

  • UUID用于生成唯一标识。
  • 纳秒级的时间精度
    • 支持在1ns内创建1m个id,保证高并发下的唯一性。
  • 基于mac地址生成。
  • 结合机器编码。
  • 引入随机数。
  • 最终生成uuid。

常用UUID生成函数包括: uuid1() uuid3() uuid4() uuid5()

常用API操作指南

8、常用API

  • 生成消息摘要的API使用。

def generate_password(password):
  #定义算法
  sha = hashlib.sha512()
  #更新算法内容区(密码字节)
  sha.update(password.encode("utf-8"))
  #使用算法生成摘要
  return sha.hexdigest()

  • Cookie操作:

response.set_cookie("uname", username)
response.set_cookie("uname", username, max_age=30)
response.set_cookie("uname", username, expires=timedelta(minutes=1))
uname = request.COOKIES.get('uname',None)
response.delete_cookie("uname")

  • 助记要点总结
    • 操作客户端Cookie唯有通过Response对象。
    • 方法无非get、set、delete三种。
  • Session操作:

- uname = request.session.get('uname')
- request.session['uname'] = username
- request.session.flush()
 - 同时清除cookie 和 session
- del request.session['uname']

  • 助记内容回顾
    • Session是存在于服务端本地的,而Request的COOKIE当中存有sessionid,因此通过Request对象去关联用户的session。
    • 方法无非get、set、del、flush四种。
  • Token操作:

response.set_cookie("utoken", token)
utoken = request.COOKIES.get("utoken")

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

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

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 算法库。