Django框架会话技术实例分析【Cookie与Session】
本文实例讲述了Django框架会话技术。分享给大家供大家参考,具体如下:
会话技术
1、Cookie
- 客户端会话技术(数据存储在客户端)
 - 以key-value的形式进行存储
 - cookie的操作都是通过Response来实现的
 - 典型场景
  
- 购物车
 - 登录信息
 
 - 支持过期时间
 - Cookie清除策略
  
- 默认关闭浏览器时cookie自动清除
 - 配置Cookie过期时间
 - max-age=0 关闭就失效
 - max-age=None 永久有效
 - max-age = int 单位秒
 - expires 过期时间,和max-age功能基本一致
 
 - 用户登出,就是清除了cookie(令牌)
 
2、Session
- 服务端会话技术
 - Session依赖于Cookie
  
- 将Session在数据库中的session_key,当作sessionid,存储在cookie中
 
 - Session数据存储在数据库中,并且做了基本的数据安全处理(base64编码)
 
3、Token
- 服务端会话技术
 - 相当于手动实现的session
 - 值应该是唯一的
  
- 要通过特定算法保证唯一
 - 时间
 - ip
 - 域名
 - 网卡 mac
 - 随机数
 
 
4、解决痛点
- 解决短连接无法保存用户状态的问题
 - 延长了请求的生命周期
 - 用户管理实例
  
- 用户注册
 - 将数据存储到数据库
 - 数据安全
    
- 密码对谁都是不透明的
 
 - 用户登陆
 - 将登陆提交过来的信息和数据库内的信息进行校验
 - 返回不成功结果要刻意模糊概念
 - 用户信息
 - 根据用户的唯一标识,去获取用户
 - 用户退出
 - 清除令牌
 - 清理cookie,session,或 token
 
 
5、数据安全
- 策略
  
- 服务器的数据对任何人来说都应该是不可见的(不透明)
 - 可以使用常见的摘要算法对数据进行摘要(md5,sha)
 - 在所有数据验证的地方都加上安全保护措施
 
 
6、摘要算法
- hashlib
  
- sha
 - md5
 - 用来验证数据完整性(不被篡改)
    
- 哪怕【消息原文】被改动一丁点,【篡改版消息生成的消息摘要】都会与【原始消息所生成的消息摘要】的大相径庭
 
 - 统一输出
    
- 输出默认都是128位二进制数
 - 32位16进制数
 
 - 单向不可逆
 
 
7、UUID
- 唯一标识
 - 纳秒级的时间
  
- 1ns 创建 1m个id
 
 - mac 地址
 - 机器编码
 - 随机数
 - uuid
 
uuid1()
uuid3()
uuid4()
uuid5()
8、常用API
- 生成消息摘要
 
def generate_password(password):
  #定义算法
  sha = hashlib.sha512()
  #更新算法内容区(密码字节)
  sha.update(password.encode("utf-8"))
  #使用算法生成摘要
  return sha.hexdigest()
- cookie
 
response.set_cookie("uname", username)
response.set_cookie("uname", username, max_age=30)
response.set_cookie("uname", username, expires=timedelta(minutes=1))
uname = request.COOKIES.get('uname',None)
response.delete_cookie("uname")
- 助记
  
- 操作客户端唯有通过Response对象
 - 方法无非get,set,delete
 
 - session
 
- uname = request.session.get('uname')
- request.session['uname'] = username
- request.session.flush()
 - 同时清除cookie 和 session
- del request.session['uname']
- 助记
  
- session是存在于服务端本地的,而Request的COOKIE当中存有sessionid,因此通过Request对象去关联用户的session
 - 方法无非get,set,del,flush
 
 - token
 
response.set_cookie("utoken", token)
utoken = request.COOKIES.get("utoken")
希望本文所述对大家基于Django框架的Python程序设计有所帮助。

