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应用。
相关推荐
FreakStudio1 小时前
一文速通 Python 并行计算:07 Python 多线程编程-线程池的使用和多线程的性能评估
python·单片机·嵌入式·多线程·面向对象·并行计算·电子diy
GOTXX2 小时前
【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门
开发语言·数据库·c++·qt·图形渲染·图形化界面·qt新手入门
猿小喵2 小时前
记录一次TDSQL网关夯住故障
运维·数据库·mysql
电商api接口开发2 小时前
如何在C#中使用LINQ对数据库进行查询操作?
数据库·c#·linq
hnsqls3 小时前
Redis 常问知识
数据库·redis·缓存
小臭希3 小时前
python蓝桥杯备赛常用算法模板
开发语言·python·蓝桥杯
mosaicwang3 小时前
dnf install openssl失败的原因和解决办法
linux·运维·开发语言·python
蹦蹦跳跳真可爱5893 小时前
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
人工智能·pytorch·python·分类·逻辑回归·学习方法
Bruce_Liuxiaowei4 小时前
基于Flask的Windows事件ID查询系统开发实践
windows·python·flask
carpell4 小时前
二叉树实战篇1
python·二叉树·数据结构与算法