Django中的Cookie与Session使用指南

Cookie与Session的基本概念

Cookie 是存储在客户端浏览器的小型文本数据(键值对),用于跟踪用户状态。例如,用户登录后,服务器生成唯一标识(如sessionid)通过Cookie返回给浏览器,后续请求自动携带该标识供服务器识别用户。

Session 是服务器端存储的会话数据,通常与Cookie配合使用。服务器生成唯一的Session ID(如随机字符串)并通过Cookie发送给客户端,用户后续请求时,服务器根据该ID读取对应的Session数据(如用户权限、偏好设置等)。

两者的核心区别在于:

  • 存储位置:Cookie在客户端,Session在服务器端。
  • 安全性:Session更安全,适合存储敏感信息(如用户ID),而Cookie可能被篡改或窃取。

Django中的Cookie操作

设置Cookie

通过HttpResponse对象的set_cookie方法设置:

python 复制代码
response = HttpResponse("设置Cookie")
response.set_cookie("username", "Alice", max_age=3600)  # 有效期1小时
return response

参数说明:

  • key :这个 cookie 的 key 。
  • value :这个 cookie 的 value 。
  • max_age :最长的生命周期。单位是秒。
  • expires :过期时间。跟 max_age 是类似的,只不过这个参数需要传递一个具体的日期,比如
  • datetime 或者是符合日期格式的字符串。如果同时设置了 expires 和 max_age ,那么将会使用
  • expires 的值作为过期时间。
  • path :对域名下哪个路径有效。默认是对域名下所有路径都有效。
  • domain :针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,那
  • 么可以设置这个属性.
  • secure :是否是安全的,如果设置为 True ,那么只能在 https 协议下才可用。
  • httponly :默认是 False 。如果为 True ,那么在客户端不能通过 JavaScript 进行操作。

读取Cookie

通过request.COOKIES字典获取:

复制代码
username = request.COOKIES.get("username", "未登录")

删除Cookie

使用delete_cookie方法:

复制代码
response.delete_cookie("username")

Django中的Session操作

配置Session存储方式

Django支持多种Session存储引擎,需在settings.py 中配置SESSION_ENGINE:

(自行添加,如果不添加就是默认的数据库存储)

  • 数据库(默认) :django.contrib.sessions.backends.db(需要先映射数据库模型)
  • 缓存 :django.contrib.sessions.backends.cache
  • 文件 :django.contrib.sessions.backends.file(需设置SESSION_FILE_PATH)。
  • 加密Cookie :django.contrib.sessions.backends.signed_cookies(数据加密后存储在客户端)。

设置Session数据

python 复制代码
request.session["user_id"] = 123  # 保存用户ID到Session
request.session.set_expiry(1200)  # 设置20分钟后过期
  • set_expiry可接受整数(秒)、datetime对象或0(关闭浏览器即失效)。

读取与删除Session

python 复制代码
user_id = request.session.get("user_id")  # 获取用户ID
del request.session["user_id"]  # 删除单个键
request.session.flush()  # 清空整个Session并删除Cookie

安全配置建议

  • HTTPOnly :设置SESSION_COOKIE_HTTPONLY = True,防止JavaScript访问Cookie。
  • SameSite :设置SESSION_COOKIE_SAMESITE = 'Lax'(默认),防止跨站请求伪造(CSRF)攻击。
  • 加密存储 :使用signed_cookies存储Session时,需确保SECRET_KEY保密,防止数据篡改。

实际应用案例:用户登录

登录视图

python 复制代码
def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(username=username, password=password)
        if user:
            request.session["is_logged"] = True  # 保存登录状态
            request.session["user"] = username
            response = redirect("/dashboard/")
            response.set_cookie("login_time", datetime.now())
            return response
    return render(request, "login.html")

登录校验装饰器

python 复制代码
def login_required(view_func):
    def wrapper(request, *args, **kwargs):
        if not request.session.get("is_logged"):
            return redirect("/login/")
        return view_func(request, *args, **kwargs)
    return wrapper

退出登录

python 复制代码
def logout(request):
    request.session.flush()  # 清除Session及Cookie
    return redirect("/login/")

配置最佳实践

  • 过期时间:建议Session过期时间短于Cookie(如Session 30分钟,Cookie 1小时),增强安全性。
  • 定期清理 :Django不会自动删除过期的Session数据,需通过clearsessions命令清理。
  • 生产环境存储:优先使用缓存(如Redis)或数据库,避免文件存储的性能瓶颈。

总结

Cookie和Session是Django中管理用户状态的核心工具:

  • Cookie适合存储非敏感信息(如主题偏好)。
  • Session 适合存储敏感数据(如用户ID、权限)。
    通过合理配置存储方式和安全参数,可构建既安全又高效的Web应用。
相关推荐
古城小栈几秒前
Pydantic 从入门到实践全讲解
python
happylifetree3 分钟前
Python18:核心语法-数据存储与运算-运算符-算术运算符
python
打工仔折腾 AI6 分钟前
从Attention到BERT:双向预训练语言模型到底解决了什么问题
人工智能·后端·python·深度学习·语言模型·bert
迅猛龙办公室22 分钟前
实现第一个python程序(HelloWorld)
开发语言·python
拉格朗日(Lagrange)43 分钟前
【第2 章】WorkBuddy 从入门到高手
开发语言·python
倔强的石头_1 小时前
多环境配置治理:开发、测试、生产连接信息如何隔离
数据库
杨云龙UP1 小时前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql
2501_933670791 小时前
2027 应用统计学秋招选岗指南:统计、SQL、业务指标如何对应岗位
数据库·sql
老歌老听老掉牙2 小时前
斜抛运动问题分析:给定最大高度与墙面位置的轨迹与时间求解
python·斜抛运动
言乐62 小时前
Python自动去除水印
开发语言·python·django·virtualenv·pygame