session的工作原理、django的超时时间设置及session过期判断
1、session原理
cookie是保存在用户浏览器端的键值对
session是保存在服务器端的键值对
session服务端中存在的数据为:


session = {
随机字符串1:{
用户1的相关信息
}
随机字符串2:{
用户2的相关信息
}
}


session客户端即客户端的浏览器的cookie中存的数据是当前用户对应的随机字符串
2、session详细解析(是否过期、失效时间)
Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下!
1.session其实就是一个Map,键=值对,通过session.getAttribute("name");获得session中设置的参数
2.session的过期时间是从什么时候开始计算的?是从一登录就开始计算还是说从停止活动开始计算?
答:从session不活动的时候开始计算,如果session一直活动,session就总不会过期。
从该Session未被访问,开始计时; 一旦Session被访问,计时清0;
3、session的工作过程
1、 生成随机字符串
2、 写到用户浏览器的cookie中
3、 保存到session中
4、 在随机字符串对应的字典中设置相关内容
而上述过程在Django中的体现为:
request.session["username"]=user
这里的username为通过request.POST.get("username")从前端html页面中获取到的用户名信息
注意:
在Django中要用session中一定要先执行:
python manage.py makemigrations
python manage.py migrate
当用户登录的时候的就会在数据库的django_session表中记录session信息
同样的通过request.session["username"]也可以获取相应的值
在这个过程中:
1、 首先获取当前用户的随机字符串
2、 根据随机字符串获取对应的内容
4、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")
5、session 的超时时间设置
5.1、django中 settings中的设置
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_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=<UTC>) 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
session的工作原理、django的超时时间设置及session过期判断的更多相关文章
- session的工作原理
asp中Session的工作原理:asp的Session是具有进程依赖性的.ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序.所以当inetinfo.exe进程崩溃 ...
- session超时时间设置方法
session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...
- unigui session超时时间设置
unigui session超时时间设置 默认的SESSION超时时间是10分钟. 网络 SOCKET 程序,像 数据库,中间件,UNIGUI等...为了防止过多的僵死连接卡死服务端,服务端都会主动踢 ...
- GS 服务器超时时间设置
工作中 遇到一个超时的问题 与徐庆同学沟通后 了解了下超时时间设置的地方 1.web.congfig问题: 常规路径 C:\Program Files\GenerSoft\bscw_local\web ...
- 接口调试工具ApiPost的发送超时时间设置方法
有部分使用ApiPost的同学反应:发送接口调试时,响应超时时间设置的太短导致接口访问失败,怎么设置呢? 就连百度也有很多人在搜: 今天就来说一说. ApiPost简介: ApiPost是一个支持团队 ...
- MYSQL的数据连接超时时间设置
大规模多线程操作事务的时候,有时候打开一个链接,会进行等待,这时候如果数据库的超时时间设置的过短,就可能会出现,数据链接自动被释放,当然设置过大也不好,慢SQL或其他因素引起的链接过长,导致整个系统被 ...
- 【Hadoop】Hadoop DataNode节点超时时间设置
hadoop datanode节点超时时间设置 datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间 ...
- (转)nginx限制上传大小和超时时间设置说明/php限制上传大小
nginx限制上传大小和超时时间设置说明/php限制上传大小 原文:http://www.cnblogs.com/kevingrace/p/6093671.html 现象说明:在服务器上部署了一套后台 ...
- httpclient超时时间设置及代理设置
超时时间 设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时间否则会影响自己系统的业务逻辑,例如阻塞系统,影响系统的吞吐量 ...
随机推荐
- Linux下软件安装的四种方式
一.源码安装 步骤: 下载,解压源码(常见的源码打包格式:.tar.gz/.tar.bz2); 可以直接下载源码再上传至linux服务器,或者在联网状态下,直接通过wget等命令获取源码安装包;源码解 ...
- get_user
Name get_user -- Get a simple variable from user space. Synopsis get_user ( x, ptr); Arguments x ...
- 使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据
所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据. 本文介绍如何使用Java代码将一张图片的隐藏信息读取出来. 首先不需要下载任何额外的Java库,用JDK自带的库就 ...
- 多目标检测分类 RCNN到Mask R-CNN
最近做目标检测需要用到Mask R-CNN,之前研究过CNN,R-CNN:通过论文的阅读以及下边三篇博客大概弄懂了Mask R-CNN神经网络.想要改进还得努力啊... 目标检测的经典网络结构,顺序大 ...
- Codeforces Round #321 (Div. 2) C Kefa and Park(深搜)
dfs一遍,维护当前连续遇到的喵的数量,然后剪枝,每个统计孩子数量判断是不是叶子结点. #include<bits/stdc++.h> using namespace std; ; int ...
- xcdatamodel的实质
修改后缀名为zip或者其它,可以查看到xcdatamodel是一个描述文件 <?xml version="1.0" encoding="UTF-8" st ...
- 2018.5.5 phpStorm破解2017.3版本方法
方法一 注册时,在打开的License Activation窗口中选择"License server",在输入框输入下面的网址: http://im.js.cn:8888 (新) ...
- MySql查询时间段的方法
本文实例讲述了MySql查询时间段的方法.分享给大家供大家参考.具体方法如下: MySql查询时间段的方法未必人人都会,下面为您介绍两种MySql查询时间段的方法,供大家参考. MySql的时间字段有 ...
- 【转】OS X 中快速调出终端
作者:Frank Pu链接:https://www.zhihu.com/question/20692634/answer/37152883来源:知乎著作权归作者所有,转载请联系作者获得授权. 来至 M ...
- Neural Style论文笔记+源码解析
引言 前面在Ubuntu16.04+GTX1080配置TensorFlow并实现图像风格转换中介绍了TensorFlow的配置过程,以及运用TensorFlow实现图像风格转换,主要是使用了文章A N ...