- 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话
- HTTP协议是无状态的,导致会话状态难以保持
- 试想一下,如果不保持会话状态,在电商网站购物的场景体验
- Cookies和Session就是为了保持会话状态而诞生的两个存储技术
2.1. 定义
cookies是保存在客户端浏览器上的存储空间
- Chrome浏览器可以通过开发者工具的Application → Storage →
Cookies
查看和操作浏览器端的所有Cookies值 - 火狐浏览器可通过开发者工具的存储 →
Cookie
查看
2.2. 特点
- cookies在浏览器上是以键-值对的形式进行存储的,键和值都是以ASCII字符串的形式存储(不能是中文字符串)
- 存储的数据带有生命周期
- cookies中的数据是按域存储隔离的,不同的域之间无法访问
- cookies的内部的数据会在每次访问此网站时都会携带到服务器端,如果cookies过大会降低响应速度
2.3. 使用
2.3.1. 存储
HttpResponse.set_cookie(key, value='', max_age=Node, expires=Node)
- key:cookie的名字
- value:cookie的值
- max_age:cookie存活时间,秒为单位
- expires:具体过期时间
- 当不指定max_age和expires时,关闭浏览器时此数据失效
2.3.2. 添加cookie
# 为浏览器添加键为my_var1,值为123,过期时间为1个小时的cookie
responds = HttpResponse('已添加my_var1,值为123')
responds.set_cookie('my_var1', 123, 3600)
return responds
2.3.3. 修改cookie
# 为浏览器添加键为my_var1,值为456,过期时间为2个小时的cookie
responds = HttpResponse('已修改my_var1,值为456')
responds.set_cookie('my_var1', 456, 3600*2)
return responds
2.3.4. 删除cookie
HttpResponse.delete_cookie(key)
删除指定的key的Cookie。如果key不存在则什么也不发生
# 删除浏览器键为my_var1的cookie
responds = HttpResponse('已删除my_var1')
responds.delete_cookie('my_var1')
return responds
2.3.5. 获取cookie
通过request.COOKIES绑定的字典(dict)获取客户端的cookies数据
value = request.COOKIES.get('cookies名', '默认值')
# 获取浏览器中my_var变量对应的值
value = request.COOKIES.get('my_var1', '没有值')
print('cookie my_Var1 = ', value)
return HttpResponse('my_Var1:', value)
三、session
3.1. 登录流程
3.2. 定义
session是服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据
3.2. 实现方式
- 使用session需要在浏览器客户端启动session,且在cookie中存储sessionid
- 每个客户端都可以在服务器端有一个独立的Session
- 【注意】:不同的请求者之间不会共享这个数据,与请求者一一对应
3.3. 初始配置
setting.py中配置session
-
向
INSTALLED_APPS
列表中添加:INSTALLED_APPS = [ ··· # 启用sessions应用 'django.contrib.sessions', ··· ]
-
向
MIDDLEWARE
列表中添加:MIDDLEWARE = [ ··· # 启用session中间件 'django.contrib.sessions.middleware.SessionMiddleware', ··· ]
3.4. 使用
session对象是一个类似于字典的SessionStore类型的对象,可以用类拟于字典的方式进行操作。
session能够存储如字符串、整形、字典、列表等
3.4.1. 保存
request.session['KEY'] = VALUE
3.4.2. 获取
value = request.session['KEY']
value = request.session.get('KEY', '默认值')
3.4.3. 删除
del request.session['KEY']
3.4.4. 配置项
settings.py中相关配置项
-
SESSION_COOKIE_AGE
作用:指定sessionid在cookies中的保存市场(默认是两周),例如:
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
-
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
设置只要浏览器关闭时,session就失效(默认为False)
注意:Django中的session数据存储在数据库中,所以使用session前需要确保已经执行过migrate
3.4.5. 问题
-
django_session表是单表设计,且该表数据量持续增加(浏览器故意删掉sessionid & 过期数据未删除)
-
可以每晚执行
$ python3 manage.py clearsessions
该命令可以删除已过期的session数据
种类 | 存储 | 安全性 |
---|---|---|
Cookies | 浏览器 | 相对不安全 |
Session | 服务器 | 相对安全 |