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应用。
相关推荐
muxue1787 分钟前
关于almalinux分区配置:
linux·运维·数据库
海天胜景1 小时前
Asp.Net Core IIS发布后PUT、DELETE请求错误405
数据库·后端·asp.net
凯子坚持 c1 小时前
【金仓数据库征文】金仓数据库 KES:MySQL 迁移实用指南
数据库·金仓数据库 2025 征文·数据库平替用金仓
dqsh061 小时前
树莓派5+Ubuntu24.04 LTS串口通信 保姆级教程
人工智能·python·物联网·ubuntu·机器人
小刘|2 小时前
Redis 中简单动态字符串(SDS)的深入解析
数据库·redis·bootstrap
sunshineine3 小时前
jupyter notebook运行简单程序
linux·windows·python
方博士AI机器人3 小时前
Python 3.x 内置装饰器 (4) - @dataclass
开发语言·python
怀君3 小时前
Flutter——数据库Drift开发详细教程(四)
数据库·flutter
万能程序员-传康Kk3 小时前
中国邮政物流管理系统(Django+mysql)
python·mysql·django
Logintern093 小时前
【每天学习一点点】使用Python的pathlib模块分割文件路径
开发语言·python·学习