跳转到主要内容

Zope会话

项目描述

此软件包提供会话支持。

Zope3会话实现

概述

会话使我们能够在无状态协议(HTTP)上模拟状态。我们通过在多个HTTP请求中存储一个唯一的标识符来实现这一点,无论是cookie还是一些扭曲到URL中的id。

IClientIdManager 工具提供了这个唯一的ID。它负责传播这个ID,以便客户端未来的请求都获得相同的ID(例如,通过设置HTTP cookie)。(注意,为了演示目的,所有接口都从这个包中导入。它们已经被移动到 zope.session.interfaces)此工具在将请求适配到唯一客户端ID时使用。

>>> from zope.app.session.interfaces import IClientId
>>> IClientId
<InterfaceClass zope.session.interfaces.IClientId>
>>> client_id = IClientId(request)

ISession 适配器为我们提供了一个映射,可以用来存储和检索会话数据。使用唯一的键(包ID)来避免命名空间冲突。

>>> from zope.app.session.interfaces import ISession
>>> pkg_id = 'products.foo'
>>> session = ISession(request)[pkg_id]
>>> session['color'] = 'red'
>>> session2 = ISession(request)['products.bar']
>>> session2['color'] = 'blue'
>>> session['color']
'red'
>>> session2['color']
'blue'

数据存储

实际数据存储在 ISessionDataContainer 工具中。ISession 通过使用包ID作为命名工具查找来选择应使用哪个 ISessionDataContainer。这允许网站管理员通过添加带有正确名称的所需 ISessionDataContainer 的注册来配置会话数据实际存储的位置。

>>> from zope.app.session.interfaces import ISessionDataContainer
>>> from zope.component import getUtility
>>> sdc = getUtility(ISessionDataContainer, pkg_id)
>>> sdc[client_id][pkg_id] is session
True
>>> sdc[client_id][pkg_id]['color']
'red'

如果无法使用包ID通过名称定位到 ISessionDataContainer 工具,则将未命名的 ISessionDataContainer 工具用作后备。将自动为您创建一个未命名的 ISessionDataContainer,如果您希望,可以用不同的实现替换。

>>> ISession(request)['unknown'] \
...     is getUtility(ISessionDataContainer)[client_id]['unknown']
True

ISessionDataContainer 包含 ISessionData 对象,而 ISessionData 对象又包含 ISessionPkgData 对象。除非您正在为会话机制编写管理视图,否则您通常不需要知道这一点。

>>> from zope.app.session.interfaces import ISessionData, ISessionPkgData
>>> ISessionData.providedBy(sdc[client_id])
True
>>> ISessionPkgData.providedBy(sdc[client_id][pkg_id])
True

ISessionDataContainer 负责过期会话数据。可以通过设置其 timeout 属性来配置过期时间。

>>> sdc.timeout = 1200 # 1200 seconds or 20 minutes

限制

会话中存储的数据必须是持久的或可序列化的。

>>> class NoPickle(object):
...     def __getstate__(self):
...         raise TypeError("Cannot serialize")
>>> session['oops'] = NoPickle()
>>> import transaction
>>> transaction.commit()
Traceback (most recent call last):
...
TypeError: Cannot serialize

页面模板

会话数据可以通过TALES在页面模板文档中访问

<span tal:content="request/session:products.foo/color | default">
    green
</span>

<div tal:define="session request/session:products.foo">
    <script type="text/server-python">
        try:
            session['count'] += 1
        except KeyError:
            session['count'] = 1
    </script>

    <span tal:content="session/count" />
</div>

CHANGES

5.0 (2023-02-10)

  • 停止支持Python 2.7,3.5,3.6。

  • 添加对Python 3.8,3.9,3.10,3.11的支持。

4.1.0 (2018-10-22)

  • 添加对Python 3.7的支持。

4.0.0 (2017-05-29)

  • 添加对Python 3.4,3.5,3.6和PyPy的支持。

  • 移除对 ZODB3 和本包不使用的其他包的依赖,仅留下 zope.session。现在测试期间使用的包现在是测试依赖项。

3.6.2 (2010-09-01)

  • 移除未声明的对 zope.deferredimport 的依赖。

3.6.1 (2010-02-06)

  • 包含来自 zope.securitypolicy 的 meta.zcml。

3.6.0 (2009-02-01)

  • 在测试中使用 zope.site 而不是 zope.app.folder

3.5.2 (2009-01-27)

  • 修复了测试中的 tearDown-Error。

3.5.1 (2007-10-31)

  • 解决了 ZopeSecurityPolicy 废弃警告。

3.5.0 (2007-09-27)

  • 发布以覆盖 download.zope.org/distribution 中的未标记、无理由的开发版本。

3.4.3 (2007-09-27)

  • 修复了包元数据。

3.4.2 (2007-09-24)

  • 重新发布以替换有缺陷的egg。

  • zope.session 添加了缺少的依赖项。

3.4.1 (2007-09-24)

  • 向egg发行版添加了缺少的文件。

3.4.0 (2007-09-24)

  • 首次发布文档。

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

zope.app.session-5.0.tar.gz (13.5 kB 查看哈希值)

上传时间 源代码

构建分发

zope.app.session-5.0-py3-none-any.whl (15.3 kB 查看哈希值)

上传时间 Python 3

支持者