Django request.session 对象基础方法实战指南

一、核心方法解析

1. get(key, default=None)

  • 功能:安全获取会话数据

  • 参数

    • key:字符串类型,数据键名

    • default:可选,当键不存在时返回默认值

  • 返回值

    • 键对应的值,或默认值
  • 应用场景

    # 获取用户选择的主题,未设置时返回默认light
    theme = request.session.get('theme', 'light')
    
  • 注意

    • 相比直接通过[]访问,可避免KeyError异常

2. __setitem__(key, value) (等价于session[key] = value)

  • 功能:设置会话数据

  • ​参数​​:

    • key:字符串键名

    • value:可序列化的数据(支持基本类型/字典/列表)

  • ​返回值​​:无

  • ​应用场景​​:

    # 保存用户语言偏好
    request.session['language'] = 'zh-CN'
    
  • 注意

    • 修改操作会自动标记modified=True

    • 存储复杂对象需确保可序列化(避免ORM对象)


3. flush()

  • 功能:清空会话并生成新sessionid

  • ​参数​​:无

  • ​返回值​​:无

  • ​应用场景​​:

    # 用户注销时完全清除会话
    def logout_view(request):
        request.session.flush()
        return redirect('/login')
    
  • 警告

    • 立即删除服务端存储数据

    • 客户端Cookie中的sessionid将失效


4. pop(key, default=None)

  • 功能:删除指定键并返回其值

  • ​参数​​:

    • key: 要删除的键

    • default: 键不存在时的返回值

  • ​返回值​​:

    • 删除键的值或默认值
  • 应用场景​​:

    # 一次性读取验证码后删除
    captcha = request.session.pop('captcha', None)
    if not captcha:
        return HttpResponse("验证码已失效")
    

5. set_expiry(value)

  • 功能:设置会话过期时间

  • ​参数类型​​:

    • 整数:秒数(如3600代表1小时)

    • 0:浏览器关闭时过期

    • None:使用全局SESSION_COOKIE_AGE配置

  • ​示例​​:

    # 保持登录状态7天
    request.session.set_expiry(7 * 86400)
    

二、辅助方法

1. clear()

  • 功能:清空所有会话数据,但保留sessionid

  • ​区别​​:

    • 不同于flush(),不删除服务端记录
  • ​适用场景​​:

    # 重置用户临时数据
    request.session.clear()
    

2. setdefault(key, default)

  • 功能:若键不存在,则设置默认值

  • ​等效逻辑​​:

    if key not in session:
        session[key] = default
    return session[key]
    

3. modified 属性

  • 作用

    • 标记会话数据是否修改

    • 可强制触发保存

  • ​示例​​:

    request.session['counter'] = 5  # 自动标记modified=True
    request.session.modified = True  # 显式强制保存
    

三、安全开发准则

1. 数据存储规范

  • ❌ 禁止存储明文密码、信用卡号等敏感信息
  • ✔️ 用户凭证仅存储ID等引用数据
# 正确做法
request.session['user_id'] = user.id

# 危险做法
request.session['user'] = {
    'id': user.id,
    'password': user.password  # 绝对禁止!
}

2. Cookie安全配置

# settings.py 推荐配置
SESSION_COOKIE_HTTPONLY = True     # 禁止JS访问
SESSION_COOKIE_SECURE = True       # 仅HTTPS传输
SESSION_COOKIE_SAMESITE = 'Lax'    # 阻止CSRF

3. 性能优化

  • 避免存储大对象(>2KB)
  • 高频读写场景使用Redis后端
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
    }
}

四、实践教学:购物车功能

代码实现

def add_to_cart(request, product_id):
    cart = request.session.get('cart', {})
    cart[product_id] = cart.get(product_id, 0) + 1
    request.session['cart'] = cart
    return JsonResponse({'status': 'success'})

def checkout(request):
    cart = request.session.pop('cart', {})  # 一次性取出清空
    if not cart:
        return HttpResponse("购物车为空")
    # 创建订单逻辑
    return render(request, 'checkout.html', {'cart': cart})

核心要点

  • get()/set()实现安全数据存取
  • flush()用于彻底销毁会话
  • set_expiry()控制会话生命周期
  • 安全准则优先防护敏感数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yant224

点滴鼓励,汇成前行星光🌟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值