Django会话–session与cookie

本文介绍了Django框架中的会话机制,包括客户端的cookies和服务器端的session如何工作。详细解释了它们的区别、如何设置及获取信息,并演示了实际应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Django会话–session与cookie

1. 前言

HTTP协议无状态,为实现通信过程中的状态保持,引入会话(简言之,在客户端、服务端保存通信中的相关数据)。

​ 状态保持的目的是在允许时间内标识访问者的状态,可以跨页面访问当前访问者的状态数据。状态与访问者绑定,不同访问者数据不共享(数据安全)。

​ 状态保持分为两个部分,客户端使用cookies保存非敏感信息(用户可以更改cookies)、服务器使用session存储具体内容;

2. cookie

2.1 简言

用户访问服务器后,服务器可以为该用户设置COOKIES(一般标识用户的身份信息)、同时在服务器保存用户关键信息,用户再次访问时会添加COOKIES的请求头、服务器收到请求后取出COOKIES信息、再与事先存储的信息加以对比,验明身份。

简言之,服务端给与客户端一个通行证(用于身份验证),客户端可以使用通行证表明身份,而不需每次都去登陆验证。

举个栗子

#DEBUG 调式获取信息。
[in]: type(request.COOKIES)
[out]: class 'dict'
  
# 提前添加了键值对{'num' : 1},但前后端通过json传递数据,所以后端获取的会是str型数据
[in]: request.COOKIES
[out]: {
        'num' : '1',
    	'__len__' : 1,
    }

2.2 获取信息

通过request.COOKIES.get()方法(COOKIES是字典型数据)可以获取COOKIES内容。

[in]: request.COOKIES.get('num', 0)
[out]: '4
  • 本质就是字典的相关方法。

2.3 设置信息

response = render(request, 'book/index.html', context=context)
response.set_cookie('num', num)
  • 服务器设置COOKIES信息,然后通过response返回给客户端,客户端下次访问时会自动带上COOKIES。

2.4 设置过期时间

普通情况下COOKIES在浏览器关闭时失效,我们可以通过设置max_ageexpires参数来设置客户端COOKIES过期时间。

  1. max_age
    max_age指定相对过期时间,即指定用户第一次访问后多少秒失效,其值为整数单位秒;

    #超过99秒后过期
    response.set_cookie(key, value, max_age=99)
    

  2. expires

    expires指定绝对失效时间,即指定COOKIES在什么时间失效,其值为datetime类对象;

    #登陆99秒后过期 
    dt = datetime.datetime.utcnow() + datetime.timedelta(seconds=99)
    response.set_cookie(key, value, expires=dt)
    

3. session

3.1 简介

COOKIES并不安全,所以COOKIES + session模型被实战应用。session数据存储于服务器比存储于客户端的COOKIES更加安全,所以只需将session_id通过COOKIES在客户-服务器之前流动即可。所以说session依赖于cookie。

Django 会将session信息存储于数据库中,可以通过request.session访问

request.session返回的是类字典对象,可以使用字典的相关方法进行操作。

# debug 部分信息
dir(request.session)
76 = {str} 'update'
77 = {str} 'values'
74 = {str} 'setdefault'
72 = {str} 'set_expiry'
71 = {str} 'session_key'
69 = {str} 'save'
68 = {str} 'pop'
64 = {str} 'keys'
63 = {str} 'items'
61 = {str} 'has_key'
55 = {str} 'flush'
56 = {str} 'get'
51 = {str} 'delete'
45 = {str} 'clear'
...

3.2 配置

以下配置信息均保存在项目目录下settings.py文件中。

配置一:添加 'django.contrib.sessions'到你的INSTALLED_APPS

配置二:添加django.contrib.sessions.middleware.SessionMiddleware到你的MIDDLEWAR


3.3 简单实用

1. get()

获取session中存储的数据。

user = request.session.get('user', None)
#使用方式同字典的get方法

2. setdefault()

向cookies存入数据

request.session.setdefault()

3. clear()

清除所有会话


4. flush()

删除当前的会话数据并删除会话的Cookie,比如用户退出登陆可以使用该方法清除会话。


5. set_expiry(value)

设置会话的到期时间,可以传递许多不同的值:

  • 如果value是整数,则会话将在多秒不活动后到期。例如,调用 request.session.set_expiry(300)会使会话在5分钟后到期。
  • 如果value是一个datetimetimedelta物体,该会议将在相应的日期/时间到期。
  • 如果value0,用户的会话cookie将在用户的Web浏览器关闭时到期。
  • 如果valueNone,则会话将恢复为使用全局会话到期策略。

3.4 延申

更多相关知识,尽在:官方文档

4 总结

  1. cookie 存储与客户端,session存储于客户端
  2. session依赖于cookie,因为服务器中用户对应的session_id需要通过cookie发送给用户
  3. 用户A和B在同一电脑的同一浏览器下访问,服务端的session中,B的信息会覆盖A,因为存储与cookie的session_id变了。
  4. 欲使用session,必须先做数据库迁移,因为session存储于数据库中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值