django session
上周一个新的应用场景,带出来了关于django session管理的问题。
公司的另一个App以Widget的形式嵌入我们的页面,就是我们提供一些url,另一个App通过iframe的形式嵌入这些url的respone页面到自己的页面中。
QA发现,当两个App都session timeout后,重新sso登录另一个App, 当打开Widget页面,发现iframe里面嵌入的我们App的页面还处于session timeout状态,只有通过强制刷新才能重新获得respone,不然没有反应。
我开始感觉有点儿奇怪,因为不管我们的App是否session timeout,只要Widget的页面发出url请求,我们的App就会进行相应的响应,没有session timeout直接返回请求内容,session timeout了,进行sso验证,然后进行App自身的authentincation验证,验证通过就解析url请求,进行相应的响应。只要account进行了sso登录,并且在我们App的user表里这个account是可用的,我们就会正常返回。
显然是中间某一步出了问题,因为我本人对django的session管理并不是很熟悉,这块儿的代码的开发者已经不再这个项目中,骤然接手,改起来相当吃力,故周末先学习一下django的Session管理。
django框架启动session只需要在setting.py中配置默认的session中间件,如果自定义了session管理中间件,要配置在django中间件的下面。
MIDDLEWARE_CLASSES = (
...
'django.contrib.sessions.middleware.SessionMiddleware',
'MyAuthenMiddleware.MySessionMiddleware',
...
) INSTALLED_APPS = (
...
'django.contrib.sessions',
...
)
此后,在有请求时,django就会给request增加一个session的dict,存放session信息。
django提供了四种方式存储session,默认的是存储到DB , 除此之外,还有存储到文件,存储到cache,存储到cookie。
相应的配置也比较简单,在setting.py里面进行 “SESSION_ENGINE”相应的设置。使用cache存储时,好像只支持分布式缓存系统,因为本地缓存保存session的时间太短了。使用cookie存储的时候,django提供了验证浏览器是否支持cookie的功能。因为本项目使用的是默认的存储到DB中的方式,所以对其它方式不是很了解,就不多说了。
django是如何管理DB中的session信息的呢?
当setting.py配置好session相关的MIDDLEWARE_CLASSES和INSTALLED_APP之后,启动项目,django就会启用Session Model层的Session类,并在数据库中生成django_session视图,视图中只有三个字段:session_key,session_date,expire_data.
每当django接受一个新的请求,都会产生一个session,这个session里面会有session_key,session_date,expire_data,当然这个session_key,session_date会被加密(用django project的secret_key进行加密),然后存储到django_session表里。
如果接受到的是一个已记录的尚未expire的session发来的请求,则会更新django_session表中session_key相同的那行记录,主要更新内容包括session_data,和expire_data。
如果session timeout,即expire_data小于当前时间,当这个session发来请求时,session就变成了anonymous,同时,request中的user.name也变成了anonymouser.
以上都是django默认的session管理,当然,开发者也可以利用django提供的方法,对session进行一定的操作。
从request中获取session :session = request.session然后就可以使用相关的方法。
具体请参考:
django session的更多相关文章
- Redis+Django(Session,Cookie)的用户系统
一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...
- Redis+Django(Session,Cookie、Cache)的用户系统
转自 http://www.cnblogs.com/BeginMan/p/3890761.html 一.Django authentication django authentication 提供了一 ...
- Django session相关操作
Django session 是存储在数据库中的所以要先跟数据库建立连接 本连接有Django跟数据库建立连接的操作:https://www.cnblogs.com/Niuxingyu/p/10296 ...
- Django session 源码流程
流程 Django session源码流程 首先执行的是SessionMiddleware的init方法 import_module(settings.SESSION_ENGINE) 导入了一个 dj ...
- Django - session 会话跟踪技术
1.session简介 |session 英 /'seʃ(ə)n/ 美 /'sɛʃən/ 基于cookies开发,将值存到服务端 写session 读session Session是服务器端技术,利用 ...
- django session 使用案例
django session 使用案例 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...
- Django 2.0 学习(21):Django Session
Django Session Session 与Cookie 1.简介 1.Cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们又需要"保持状态",因 ...
- Django Session配置
Django Session的三种存储方式 SESSION_ENGINE='django.contrib.sessions.backends.db' # default 保存到数据库中,依赖 'dja ...
- Django session cookie 上传文件、详解
session 在这里先说session 配置URL from django.conf.urls import patterns, include, url from django.contrib i ...
随机推荐
- unity label和图片 gui
#pragma strict var str:String; //接收外部复制贴图 var imageTexture:Texture; private var imageWidth:int; priv ...
- BZOJ3853 : GCD Array
1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$ \[\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=&v[\gcd(\fr ...
- C#创建桌面快捷方式 和 开机启动
/// <summary> /// 创建桌面快捷方式 2010-11-25 /// </summary> p ...
- BZOJ 1856 字符串(组合)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1856 题意:有n个1和m个0组成的串,使得任意前k个中1的个数不少于0的个数.有多少种这 ...
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ERROR 2013 (HY00 ...
- JavaScript事件大全3
//无模式的提示框 //屏蔽按键 <html> <head> <meta http-equiv="Content-Type" content=& ...
- php中alert弹出时单双引号问题
php代码中单双引号问题是个很重要的问题,使用不当会造成很多麻烦.先记录一下今天写alert遇到的麻烦.我做登录的时候,成功时想弹出个提示说登录成功.写alert语句时不显示.其实就是单双引号弄得不对 ...
- php目录文件下有php-ini-development和php.ini-production。
1.apache: 只需要你解压到相应目录既可以,比如我这边将下载的apache文件解压到 C:\Apache24: bin目录下有: ApacheMonitor.exe和httpd.exe可用于服务 ...
- Hrbustoj 1429 二分+计算几何
http://www.bubuko.com/infodetail-1121744.html 在这个上面学习了方法 如果要判断巨量的点 就应该使用二分法 思路是先从a[1] a[n] a[2]来判断是否 ...
- Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)
主要函数: filetype() 判断文件类型 filesize() 得到文件大小(字节) is_readable() 判断文件是否可读 is_writeable() 判断文件是否可写 is_exec ...