上周一个新的应用场景,带出来了关于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然后就可以使用相关的方法。

具体请参考:

Using sessions in views

django session的更多相关文章

  1. Redis+Django(Session,Cookie)的用户系统

    一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...

  2. Redis+Django(Session,Cookie、Cache)的用户系统

    转自 http://www.cnblogs.com/BeginMan/p/3890761.html 一.Django authentication django authentication 提供了一 ...

  3. Django session相关操作

    Django session 是存储在数据库中的所以要先跟数据库建立连接 本连接有Django跟数据库建立连接的操作:https://www.cnblogs.com/Niuxingyu/p/10296 ...

  4. Django session 源码流程

    流程 Django session源码流程 首先执行的是SessionMiddleware的init方法 import_module(settings.SESSION_ENGINE) 导入了一个 dj ...

  5. Django - session 会话跟踪技术

    1.session简介 |session 英 /'seʃ(ə)n/ 美 /'sɛʃən/ 基于cookies开发,将值存到服务端 写session 读session Session是服务器端技术,利用 ...

  6. django session 使用案例

    django session 使用案例 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

  7. Django 2.0 学习(21):Django Session

    Django Session Session 与Cookie 1.简介 1.Cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们又需要"保持状态",因 ...

  8. Django Session配置

    Django Session的三种存储方式 SESSION_ENGINE='django.contrib.sessions.backends.db' # default 保存到数据库中,依赖 'dja ...

  9. Django session cookie 上传文件、详解

    session 在这里先说session 配置URL from django.conf.urls import patterns, include, url from django.contrib i ...

随机推荐

  1. unity label和图片 gui

    #pragma strict var str:String; //接收外部复制贴图 var imageTexture:Texture; private var imageWidth:int; priv ...

  2. BZOJ3853 : GCD Array

    1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$ \[\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=&v[\gcd(\fr ...

  3. C#创建桌面快捷方式 和 开机启动

              /// <summary>         /// 创建桌面快捷方式 2010-11-25         /// </summary>         p ...

  4. BZOJ 1856 字符串(组合)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1856 题意:有n个1和m个0组成的串,使得任意前k个中1的个数不少于0的个数.有多少种这 ...

  5. 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 ...

  6. JavaScript事件大全3

    //无模式的提示框 //屏蔽按键 <html> <head>    <meta http-equiv="Content-Type" content=& ...

  7. php中alert弹出时单双引号问题

    php代码中单双引号问题是个很重要的问题,使用不当会造成很多麻烦.先记录一下今天写alert遇到的麻烦.我做登录的时候,成功时想弹出个提示说登录成功.写alert语句时不显示.其实就是单双引号弄得不对 ...

  8. php目录文件下有php-ini-development和php.ini-production。

    1.apache: 只需要你解压到相应目录既可以,比如我这边将下载的apache文件解压到 C:\Apache24: bin目录下有: ApacheMonitor.exe和httpd.exe可用于服务 ...

  9. Hrbustoj 1429 二分+计算几何

    http://www.bubuko.com/infodetail-1121744.html 在这个上面学习了方法 如果要判断巨量的点 就应该使用二分法 思路是先从a[1] a[n] a[2]来判断是否 ...

  10. Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)

    主要函数: filetype() 判断文件类型 filesize() 得到文件大小(字节) is_readable() 判断文件是否可读 is_writeable() 判断文件是否可写 is_exec ...