Python Django Web 框架会话技术(Cookie、Session、Token)
一,什么是会话技术
Web浏览器和服务器之间的所有通信,都是通过HTTP协议进行的,该协议是无状态,短连接的。协议无状态的事实,意味着客户端和服务器之间的消息,完全相互独立 没有基于先前消息的“序列”或行为的概念。
会话:浏览器访问服务器端,发送多次请求,接受多次响应。直到有一方断开连接。会话结束。
解决问题:可以使用会话技术,在一次会话的多次请求之间共享数据。
通俗的说,因为Http协议是一个无状态协议,两次登录之间没有任何联系,想让它们之间有关系,就有了会话技术。也就是相当于变相延长了请求周期而且保存了用户的关键信息
二,会话技术分类:
客户端会话技术 Cookie
服务器端会话技术 Session,Token
三,Cookie会话技术
Cookie属于客户端(浏览器端)的会话技术,也就是数据存储在客户端的
Cookie是服务端创建,通过Response将cookie写到浏览器上,保存于客户端,客户端每次发送请求时都会将Cookie信息发送到服务器(因为Cookie是请求头信息的一部分)
数据存储形式:以key-value的形式进行存储,也就是键值对的形式
Cookie隔离:cookie不能跨浏览器不能跨域名,不同的域名、不同的ip之间cookie是隔离的,也就是不同浏览器登录后不影响其他浏览器登录
Cookie不支持中文
Cookie支持过期时间
Cookie清除策略:默认关闭浏览器时cookie自动清除
配置Cookie过期时间:
max-age=0 关闭就失效
max-age=None 永久有效
max-age = int 单位秒
expries 整数,指定过期时间,还支持是一个datetime或timedelta,可以指定个具体日期时间,和max-age功能基本一致
max_ age 和expries两个选一个设定
代码实现:
设置Cookie
def setcookie(request):
response = HttpResponse('设置COOKIE成功')
# 普通设置,以明文的方式显示
response.set_cookie('uid','id')
#加盐设置,以加密的形式显示
response.set_signed_cookie('uid', id, "YJS")
return response
获取Cookie
def getcookie(request):
return HttpResponse(request.COOKIES.get('uid'))
删除Cookie
def logout(request):
response = redirect(reverse("App:login"))
response.delete_cookie("uid")
return response
四,Session会话技术
Session属于服务器端会话技术,也就是数据存在服务器,依赖于cookie
Session是用来表示一个用户与服务端的一次“会话”。使用客户端发送的sessionid(存在与Cookie中)与服务端的Sessionid匹配,找到客户端请求所属的“会话”,经常用于登录验证。
Session一般保存在内存中,在Django中将Session持久化到数据库中保存,若想变更Session的保存方式,需要添加SESSION_ENGINE配置信息,可以将session保存到redis中。
django_session表中存在三个字段:
session_key 主键
session_data 数据,使用BASE64编码做了一个简单的数据安全
session_experis 过期时间,django中默认两周
常用操作
get(key.default None)根据键获取会话的值
clear()清楚所有会话
flush()删除当前的会话数据并删除会话的cookie
delete request.['session. id'] 删除会话
代码实现:
Session存储数据
request.session['username'] = uanme # username为key uname为value
Session读取数据
uname = request.session.get('username') # username为key
Session删除数据
del request.session["username"] # username为key
request.session.flush() 同时清除cookie和session
request.session.clear() 清除所有session
session重要配置
①、SESSION_EXPIRE_AT_BROWSER_CLOSE = True
当浏览器关闭时,清除本地Cookie
②、 SESSION_COOKIE_AGE = 60
设置session保存的秒数‘
扩展:将session保存到redis
①安装django-redis-sessions库
pip install django-redis-sessions
②在settings.py中配置
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS = {
'host':'127.0.0.1',
'port':6379,
'db':0,
'password':'Redis密码',
'prefix':"key前缀",
'socket_timeout':5
}
五,Token会话技术
Token属于服务器端会话技术,也就是数据存在服务器,自定义的Session也就是相当于手动实现的Session,在创建Model时添加token字段映射到数据库中
.
当第一次验证成功(用户名和密码正确),服务端对用户数据进行签名生成一个token,并将该token发送到客户端,当客户端发送请求时,会携带该token到服务器端,服务端对该token进行解密验证,当验证成功,则说明用户验证通过,否则验证失败.要通过特定算法保证唯一
基本算法
①MD5摘要算法
用来验证数据完整性 ,单向不可逆,防爆破性高,统一输出,默认输出128位的二进制,32位的16进制使用hexdigest()
②应用
访问IP+用户名+现行时间生成MD5的32位字符串
代码实现:
import hashlib
import datetime
def create_token(ip, sname):
time = str(datetime.datetime.now())
r = sname
return hashlib.new("md5", (ip + time + r).encode("utf-8")).hexdigest()
使用方式
①使用在移动端或客户端开发中,通常以Json形式传输,需要移动端自己存储Token,需要获取Token关联数据的时候,主动传递Token
代码实现:
def home(request): # 客户端访问时候需要带上token
token = request.GET.get('token')
if token:
return JsonResponse({
'status': '200'
'name':'YJS'
})
②在web开发中,Token和session类似,携带在cookie中。
代码实现:
def home(request):
token = request.COOKIES.get("token")
if token:
user = User.Objects.get(token=token)
return HttpResponse('登录成功')
代码实现:
Token 存储数据
t
oken = create_token(ip, sname) # 通过加密算法函数实现自定义创建token
student.s_token = token
student.save() # 将token数据映射到用户数据表中
Token 返回数据
response = redirect(reverse('Three:home'))
response.set_cookie('token', token) # 通过cookie将自定义token返回至客户端
return response
Token 读取数据
token = request.COOKIES.get('token') # 通过cookie将自定义token读取至服务器端
Token 清空数据
student = Student.objects.get(s_token=token)
student.s_token = '' # 通过重新写入方式将用户token数据清空 实现结束会话
student.save()
六,三种会话技术对比
Cookie : 使用更简洁,服务器压力更小,数据不是很安全
Session : 服务器要维护Session,相对安全
Token : 拥有Session的所有优点,自己维护略微麻烦,支持更多的终端