基于cookie做用户验证时:敏感信息不适合放在cookie中
session依赖cookie
使用session首先要进行以下操作:
session
1. installed_apps
2. 中间件
3. 设置存储形式
4. 引用 request.session
django session的设计原理
1. 如果用户是第一次请求(如何看用户是不是第一次请求,就看客户端ID是否保存了session的cookie)
a) 创建session model
i. 生成一个key sessionID 随机的一个字符串 uuid
ii. 保存到用户的浏览器cookie中
iii. 保存到session_engine指定的位置
2. 如果第二次以上的请求,客户端ie都会自动提交cookie到django,django中利用你配置的sessionmiddleware中间件激活session利用cookie中的sessionID到session_engine指定的位置读取session model并设置到request的session属性上
3. 真是因为这样,你才能在你的view里面通过request.session使用session
4. session本身就是一个dict字典
5. session在存数据时数据必须支持序列化json
Django中对于session的存储方式:
Django中支持session,其中内部提供了5种类型session供开发者使用:
数据库(默认)
缓存
文件
缓存+数据库
加密cookie
1、如果是数据库,需要在settings.py中配置如下:
SESSION_ENGINE=’django.contrib.sessions.backends.db’(引擎(默认))
2、如果是缓存session,需要settings.py中配置如下:
SESSION_ENGINE ='django.contrib.sessions.backends.cache'(引擎)
SESSION_CACHE_ALIAS= 'default' 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3、 如果是文件session, 需要在settings.py中配置如下:
SESSION_ENGINE ='django.contrib.sessions.backends.file' (引擎)
SESSION_FILE_PATH=None 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4、 如果是缓存+数据库session,需要在settings.py中配置如下:
SESSION_ENGINE='django.contrib.sessions.backends.cached_db' (引擎)
配置setting.py
SESSION_COOKIE_NAME = ‘sessionid’ #Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH=’/’ #session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN=None #session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE=False #是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY=True #是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE=1209600 #session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE=False #是否每次请求都保存session,默认修改之后才保存(默认)
session原理:
cookie是保存在浏览器端的键值对
session是保存在服务器端的键值对
session服务端中存在的数据为:
session={
随机字符串1:{用户1 的信息}
随机字符串2:{用户2 的信息}
}
session客户端即客户端的浏览器的cookie中存的数据是当前用户对应的随机字符串
session的工作过程
1、 生成随机字符串
2、 写到用户浏览器的cookie中
3、 保存到session中
4、 在随机字符串对应的字典中设置相关内容
而上述过程在Django中的体现为:
request.session[‘username’]=user
这里的username为通过request.POST.get(‘username’)从前端html页面中获取到的用户名信息
同样的通过request.session[“username”]也可以获取相对应的值
在这个过程中:
1、首先获取当前用户的随机字符串
2、根据随机字符串获取对应的内容
session的操作
request.session[‘k1’]如果不存在则会报错
request.session.get[‘k1’],如果不存在则会报错,为了防止出错可以
request.session.get[‘k1’,none]
request.session[‘k1’]=123设置session值
request.session.setdefault[‘k1’,123]存在则不设置
del request.session[‘k1’]删除
request.session.clear()删除
所有的键、值、 键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
用户session的随机字符串
request.session.session_key
将所有session失效日期小于当前日期的数据删除
request.session.clear_expired()
检查用户session的随机字符串在数据库中是否存在
request.session.exists(‘session_key’)
删除当前用户的所有session数据
request.session.delete(‘session_key’)
request.session.set_expiry(value)
默认的过期时间是两周,如果自己设置过期时间,这样自己设定的优先级就会高于默认的。
如果value是个整数,session会在些秒数后失效。
如果value是个datatime或者timedelta,session就会在这个时间后消失。
如果value是0,用户关闭浏览器session就会消失。
如果value是none,session会依赖全局session失效策略。