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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |