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的所有优点,自己维护略微麻烦,支持更多的终端

微信关注

阅读剩余
THE END