您的位置:首页 > 编程语言 > Go语言

jango.contrib.sessions-SessionBase

2015-10-29 11:04 387 查看



摘要 上篇说了django sessions模块的处理流程。session-data的数据管理,都是由一个类负责。这个基类是SessionBase,我们可以继承SessionBase,实现自己对session-data的管理。

SessionBase之所以可当作字典来操作,因为它本身就是对字典的包装。所以需要了解一下python的一些魔法方法。

举个例子:

?
__getitem__ 负责获取数据。

__setitem__负责改变数据。

__delitem__负责删除数据。

__contains__负责判断是否包含这个key。

然后看SessionBase的定义:

?
除了上述几个魔法方法, SessionBase还实现了dict的其他的方法。

基本上都是_session的包装。

现在来看看_session的定义:

?
_session的值是_get_session方法返回的。

?
_get_session方法会优先去获取_session_cache这个缓存变量的值,如果没有则调用load方法。

注意self.accessed属性的改变。它会记录是否获取过session。

?
load方法需要子类定义,返回session-data。

一般load实现要注意这种情况,用户第一次登陆是没有_session_cache。注意_get_session方法,它会通过捕获AttributeError异常,判断是否存在_session_cache。如果没有会调用load方法。

所以当用户没有_session_cache的时候,需要返回一个空字典。

注意一下clear的实现。因为执行clear函数时,如果self._session有可能会调用load函数,导致不必要的性能开销。

所以直接复制_session_cache为空。

?
因为session和cookie会有一个有效期,以'_session_expiry'存在_session_data里。

?
这里注意_session_expiry对应的值,可能是为int,也可能是datetime类型。如果为int,则表示剩下的有效期,以second为单位。如果为datetime类型,则为有效日期,需要计算两者的时间差,也是以second为单位。

get_expire_at_browser_close方法用来判断session的截至时间是否为关闭浏览器的时间。

当_session_expiry为None并且settings.SESSION_EXPIRE_AT_BROWSER_CLOSE设置为true,

当_session_expiry为0,

都会返回true。

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: