加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

django sessions模块SessionStore和Session相关代码详细讲解

发布时间:2020-12-15 17:14:15 所属栏目:大数据 来源:网络整理
导读:django sessions模块SessionStore和Session相关代码详细讲解 django版本 2.1.1 Session? 引用: from?django.contrib.sessions.models?import?Session 代码: class?Session(AbstractBaseSession):????"""????????django提供对匿名会话的全面支持,session框

django sessions模块SessionStore和Session相关代码详细讲解

django版本

2.1.1

Session?
引用:

from?django.contrib.sessions.models?import?Session

代码:

class?Session(AbstractBaseSession):
????"""
????
????django提供对匿名会话的全面支持,session框架让你在非常方便识别每一个网站访问者的依据。session数据
????存储在服务端并且将发送和收到的cookies进行抽象画。cookie包含了一个session?id,而不会是数据本身。
????
????django?session框架完全基于cookie,不需要再url中添加session?id,这是专门这样设计,因为在网址中添加
????session?id不仅让网址看起来十分丑陋,而且极容易通过请求头中referer标记泄露session?ID。
????"""
????objects?=?SessionManager()
????
????#?该方法主要获取SessionStore?
????#?等同于
????#?from?django.contrib.sessions.backends.db?import?SessionStore
????@classmethod
????def?get_session_store_class(cls):
????????from?django.contrib.sessions.backends.db?import?SessionStore
????????return?SessionStore
????????
????#?session?的表名字
????class?Meta(AbstractBaseSession.Meta):
????????db_table?=?'django_session'

AbstractBaseSession

#?这是一个标准的django?model
class?AbstractBaseSession(models.Model):
????#?存储session_key?
????session_key?=?models.CharField(_('session?key'),?max_length=40,?primary_key=True)
????#?解开session_data需要setting.py中SECRET_KEY
????session_data?=?models.TextField(_('session?data'))
????#?数据过期时间
????expire_date?=?models.DateTimeField(_('expire?date'),?db_index=True)

????objects?=?BaseSessionManager()

????class?Meta:
????????abstract?=?True
????????verbose_name?=?_('session')
????????verbose_name_plural?=?_('sessions')

????def?__str__(self):
????????return?self.session_key

????@classmethod
????def?get_session_store_class(cls):
????????raise?NotImplementedError
????
????#?session_data进行数据解密
????def?get_decoded(self):
????????#?等同于引用SessionStore
????????#?from?django.contrib.sessions.backends.db?import?SessionStore
????????session_store_class?=?self.get_session_store_class()
????????return?session_store_class().decode(self.session_data)

SessionStore-会话存储

代码

class?SessionStore(SessionBase):

????def?load(self):
????????"""
????????加载数据从秘钥本身代替从外部存储的数,和_get_session_key()方法相反,
????????如果签名失败会提示BadSignature
????????"""
????????try:
????????????return?signing.loads(
????????????????self.session_key,????????????????serializer=self.serializer,????????????????#?This?doesn't?handle?non-default?expiry?dates,?see?#19201
????????????????max_age=settings.SESSION_COOKIE_AGE,????????????????salt='django.contrib.sessions.backends.signed_cookies',????????????)
????????except?Exception:
????????????#?BadSignature,ValueError?或则是序列化数据异常,当遇到这些错误
????????????#?会重置session
????????????self.create()
????????return?{}

????def?create(self):
????????"""
????????#?当客户端发出请求时,创建一个新的秘钥,设置一个可以修改标记,以便设置Cookie
????????"""
????????self.modified?=?True

????def?save(self,?must_create=False):
????????"""
????????当用户在客户端上发出请求时,需要需要保存获取会话密钥作为安全签名的字符串,然后进行设置
????????修改后的标志。
????????
????????"""
????????self._session_key?=?self._get_session_key()
????????self.modified?=?True

????def?exists(self,?session_key=None):
????????"""
????????当您与共享资源对话时,此方法很有意义,但是,当您将信息存储在客户端的cookie中时,这并不重要。
????????"""
????????return?False

????def?delete(self,?session_key=None):
????????"""
????????当客户端发出请求时,请求删除session数的标记状态
????????"""
????????self._session_key?=?''
????????self._session_cache?=?{}
????????self.modified?=?True

????def?cycle_key(self):
????????"""
????????使用新密钥,保留相同的数据。?
????????调用save(),它将在请求结束时使用新密钥自动保存cookie。.
????????"""
????????self.save()

????def?_get_session_key(self):
????????"""
????????????????全通过url-safebase64编码的数据字符串生成一个安全session?key。
????????????????来代替使用随机字符串作为session?key,
????????"""
????????return?signing.dumps(
????????????self._session,?compress=True,????????????salt='django.contrib.sessions.backends.signed_cookies',????????????serializer=self.serializer,????????)

????@classmethod
????def?clear_expired(cls):
????????pass


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读