1、session原理
cookie是保存在用户浏览器端的键值对
session是存储在服务器端的键值对
session服务端存在的数据如下。
session={
随机字符串1:{
用户1的相关信息
}
随机字符串2:{
关于用户2的信息
}
}
作为会话客户端的客户端的浏览器cookie中存储的数据是与当前用户相对应的随机字符串
2、session详细分析(是否过期、过期时间) ) ) ) ) ) ) ) ) )。
Session在我们做web项目时很常用,以前我不太在意,但这次我又仔细看了一下!
1.session其实是一个Map,它是一个键=值对,包含session.getattribute('name ); 获取在session中设定的参数
2.session的有效期是从什么时候开始计算的? 是一注册就开始计算,还是从停止活动开始计算?
a )从会话不活动时开始计算,如果会话一直活动,会话很难过期。
从该Session未被访问开始计时; 当Session被访问时,时间清零0;
3、会话工作过程
1、生成随机字符串
2、写在用户浏览器的cookie上
3、保存在会话中
4、设置与随机字符串对应的词典相关的内容
在Django中,上述过程如下。
request.session [ ' username ' ]=user
此处的username是在request.POST.get('username ' )中从前端html页面获取的用户名信息
注意:
要在Django上使用会话,请务必先执行:
python manage.py makemigrations
python manage.py migrate
用户登录后,session信息会记录在数据库的django_session表中
同样,也可以从request.session['username']中检索适当的值
在这个过程中:
1、首先获取当前用户的随机字符串
2、从随机字符串中获取对应内容
4、会话操作
如果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 ) )。
删除当前用户的所有会话数据
request.session.delete (session _ key ) )。
5、设置会话超时时间
5.1、通过django设置
session _ cookie _ name=' session id ' # 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_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
Session使用比较简单,在request.session是一个字典类。session是保存在数据库中的。
5.2、在views中的设置
request.session.set_expiry(value)
默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的
如果value是个整数,session会在些秒数后失效。
如果value是个datatime或timedelta,session就会在这个时间后失效。
如果value是0,用户关闭浏览器session就会失效。
如果value是None,session会依赖全局session失效策略。
注意:
Django中设置session过期时间:
request.session.set_expiry(timedelta(days=30))
运行提示错误:TypeError: datetime.datetime(2018, 7, 3, 7, 36, 57, 636224, tzinfo=) is not JSON serializable
解决办法:
在setting中添加:
SESSION_SERIALIZER='django.contrib.sessions.serializers.PickleSerializer'
6、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),此处别名依赖缓存的设置
1、 如果是文件session, 需要在settings.py中配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)
SESSION_FILE_PATH=None 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
2、 如果是缓存+数据库session,需要在settings.py中配置如下:
SESSION_ENGINE='django.contrib.sessions.backends.cached_db' (引擎)
7、session的过期判断;
1) 以前是根据 if(session.getAttribute('user')==null)判断是否为空
=========================================================================================
2) 如下为看到的一个帖子,判断session不为空的好方法:
request.getSeesion(boolean)方法,一下子让我恍然大悟。这个方法里面传了一个boolean值,这个值如果是true,那么如 果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在request的当前会话不存在的时候就返回null。
这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以“近似地”认为session不存在就是session过期了,那么我们就可以很容易地判断session是否过期了。方法如下:
if(request.getSession(false)==null){
System.out.println("Session has been invalidated!");
}
else{
System.out.println("Session is active!");
}
可能大家注意到我上面有一个“近似地”字眼,也就是说存在特别情况。
这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null