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)。
  • 加密Cookiedjango.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应用。
相关推荐
zdy1263574688几秒前
python第31天打卡
开发语言·python
Tapdata11 分钟前
干货 | 异构数据库日志怎么解析才不踩坑?
数据库
愚农搬码22 分钟前
SpringBoot集成Milvus向量库实现CRUD
数据库·人工智能
AщYΘ29 分钟前
6.3 day 35
python
leo030830 分钟前
torch.distributed.launch 、 torchrun 和 torch.distributed.run 无法与 nohup 兼容
人工智能·pytorch·python·深度学习·分布式训练
编程有点难31 分钟前
Python训练打卡Day41
开发语言·python
请输入验证码32 分钟前
PyTorch 入门学习笔记(数字识别实战)
人工智能·pytorch·python·神经网络
FL162386312936 分钟前
[yolov11改进系列]基于yolov11使用图像去雾网络UnfogNet替换backbone的python源码+训练源码
开发语言·python·yolo
橙色小博1 小时前
利用Python 进行自动化操作: Pyautogui 库
开发语言·python·自动化·pyautogui·办公
fydw_7151 小时前
深入解析 Flask 命令行工具与 flask run命令的使用
后端·python·flask