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_age
或expires
参数来设置客户端COOKIES
过期时间。
-
max_age
max_age
指定相对过期时间,即指定用户第一次访问后多少秒失效,其值为整数单位秒;#超过99秒后过期 response.set_cookie(key, value, max_age=99)
-
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
是一个datetime
或timedelta
物体,该会议将在相应的日期/时间到期。 - 如果
value
是0
,用户的会话cookie将在用户的Web浏览器关闭时到期。 - 如果
value
是None
,则会话将恢复为使用全局会话到期策略。
3.4 延申
更多相关知识,尽在:官方文档
4 总结
- cookie 存储与客户端,session存储于客户端
- session依赖于cookie,因为服务器中用户对应的session_id需要通过cookie发送给用户
- 用户A和B在同一电脑的同一浏览器下访问,服务端的session中,B的信息会覆盖A,因为存储与cookie的session_id变了。
- 欲使用session,必须先做数据库迁移,因为session存储于数据库中。