sessionstoreage ajax,django sessions模块SessionStore和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

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值