Zope和Plone的烧杯集成
collective.beaker的Python项目详细描述
collective.烧杯-Zope 2和Plone的烧杯集成。
此包提供了一种配置烧杯会话管理和缓存框架的方法 在Zope 2(和Plone)环境中使用。
通常,烧杯是使用wsgi中间件配置的。然而,Zope 2确实 默认情况下(尚未)不运行wsgi(除非使用 repoze.zope2 )。这个包裹 提供另一种基于zope.conf的配置语法。
安装
要使用此软件包,您需要安装它。通常,你会这样做 通过您自己软件包的setup.py中的install-requires行
install_requires=[ ... 'collective.beaker', ],
您也可以使用buildout.cfg中的 eggs 行安装它,例如:
[instance] ... eggs = ... collective.beaker
如果您使用的是zope 2.10(例如,对于plone 3),还需要安装 zpublisherEventsBackport 包。你可以 通过依赖于额外的 [zope2.10] 获取这个依赖项,例如:
[instance] ... eggs = ... collective.beaker [Zope2.10]
如果您在Zope2.12或更高版本中,则默认情况下包含相关事件, 你不应该依赖于ZpublisherEventsBackport或 [zope2.10] 额外。
配置烧杯
要配置烧杯,请在 zope.conf中添加如下部分:
<product-config beaker> cache.type file cache.data_dir /tmp/cache/data cache.lock_dir /tmp/cache/lock cache.regions short, long cache.short.expire 60 cache.long.expire 3600 session.type file session.data_dir /tmp/sessions/data session.lock_dir /tmp/sessions/lock session.key beaker.session session.secret secret </product-config>
如果您使用buildout和 plone.recipe.zope2instance来生成 zope.conf ,您可以使用以下选项:
[instance] ... zope-conf-additional = <product-config beaker> cache.type file cache.data_dir ${buildout:directory}/var/cache/data cache.lock_dir ${buildout:directory}/var/cache/lock cache.regions short, long cache.short.expire 60 cache.long.expire 3600 session.type file session.data_dir ${buildout:directory}/var/sessions/data session.lock_dir ${buildout:directory}/var/sessions/lock session.key beaker.session session.secret secret </product-config>
在这里,我们还使用了buildout替换来放置缓存和会话 构建目录中的目录。
您还需要加载 collective.beaker 包的配置。 这可以用这样的zcml行来完成:
<include package="collective.beaker" />
这可以在您自己的configure.zcml中,也可以在zcml slug中。如果你是 使用buildout和 plone.recipe.zope2instance,您可以安装一个slug 通过添加一个 zcml 行,例如:
[instance] ... zcml = collective.beaker
通过 <;产品配置 烧杯>; 部分中的设置 直接到烧杯。有关烧杯配置的更多详细信息,请参见 烧杯配置文档 可用选项。
请注意:
- 所有缓存设置都必须以 缓存作为前缀。
- 所有会话设置都必须以 会话作为前缀。
对于会话设置,以下默认设置适用:
- invalidate_corrupt=true ,因此损坏的会话将失效
- 类型=无 和 数据目录=无 ,因此默认为内存中 会话
- key=beaker.session.id -这是cookie键
超时=无 ,因此会话不会超时- secret=none ,因此会话cookie不加密
- 日志文件=无 ,因此没有日志记录
使用会话
要从请求获取烧杯会话,请使用以下模式:
>>> from collective.beaker.interfaces import ISession >>> session = ISession(request)
有关结果的详细信息,请参见烧杯会话文档 会话对象。你或多或少可以把它当作一本带字符串的字典 按键:
>>> session['username'] = currentUserName
如果修改会话,则需要手动保存它:
install_requires=[ ... 'collective.beaker', ],0
或者,您可以将 session.auto 配置键设置为 on , 每次请求都会自动保存会话。
如果要删除会话,请使用:
install_requires=[ ... 'collective.beaker', ],1
注意烧杯不会自动终止/移除会话,因此您可以 必须自己动手。
如果要使会话无效并创建新会话,请使用:
install_requires=[ ... 'collective.beaker', ],2
注意,SES当每个请求开始时,基于 从zope.conf中读取的会话设置。可以覆盖这些 通过注册一个实用程序,从这个包中提供 isessionconfig 。这个 实用程序必须实现dict api(您可以使用常规dict或 例如,持久映射对象)。例如,这允许站点- 提供每个站点会话数据的本地实用程序。
使用缓存
烧杯文档说明了如何将缓存管理器创建为 全局变量。cachemanager实例提供decorators和 使用缓存的函数。你仍然可以使用这个模式,但这将 不使用zope.conf中由collective.beaker管理的任何配置
但是,您可以使用缓存区域以及显式缓存api。AT 运行时(但在模块范围内 不是 )您可以获得烧杯 缓存管理器 按照zope.conf进行配置,如下所示:
install_requires=[ ... 'collective.beaker', ],3
现在,您可以按照烧杯文档以编程方式使用它,例如:
install_requires=[ ... 'collective.beaker', ],4
有关详细信息,请参阅烧杯缓存文档。
您还可以使用缓存区域装饰符,例如使用:
install_requires=[ ... 'collective.beaker', ],5
如果配置了"short"区域(如 zope.conf中所示) 上面的例子),这将懒散地查找区域设置并使用那些 用于缓存。
要使缓存失效,可以调用:
install_requires=[ ... 'collective.beaker', ],6
有关详细信息,请再次参阅烧杯文档。
测试
如果您正在为使用烧杯会话或 缓存,在调用 相关代码。否则,可能会出现组件查找错误 在 isessionconfig 或 icachemanager 层上。这是因为整合 使用 zopetestcase / plonetestcase 编写的测试不读取 zope.conf 因此 collective.beaker 配置代码没有 加载时有任何配置数据。
您可以通过以下两种方式之一来处理此问题:
- 注册您自己的 isessionconfig 和/或 icachemanager 实用程序。 有关详细信息,请参见 interfaces.py 。
- 在zcml处理之前提供"假"zconfig设置。
您可以在 collective.beaker.testing.beakerconfiglayer中使用测试层。 做后者。你要确保这层之前已经混合好了 执行zcml处理的任何层。例如:
install_requires=[ ... 'collective.beaker', ],7
当然,您可以在 层。重要的是,beakerconfiglayer plonesitelayer,它将配置站点。
此设置将使用默认设置(请参见 testing.py 了解 值),但您可以在每个设置的基础上操作这些值。例如:
install_requires=[ ... 'collective.beaker', ],8
请记住,这通常是一个全局实用程序,因此任何更改都将 跨测试边界,除非您也正确地删除了设置。因此, 在层中进行此设置可能比在 单独测试。
在编写使用烧杯会话的测试时,如果不执行 使用类似于zope.testbrowser的函数测试 需要模拟请求开始/结束事件 侦听以配置会话。
例如:
install_requires=[ ... 'collective.beaker', ],9
在单元测试中,仅仅提供一个mock isession可能更容易。 请求的适配器。这里有一个模拟会话实现 可帮助您完成此操作的软件包:
[instance] ... eggs = ... collective.beaker0
与"真实"会话一样,测试会话与请求绑定,因此 每次在 请求。你可以还要检查以下属性以查看会话 已使用:
- 如果调用了一次save() ,则 \u saved 为真。
- \u invalidated 如果调用一次 invalidate() 则为true。
- 如果调用了一次delete() ,则 \u deleted 为真。
最后, accessed() 将返回true,并且 最后一次访问的属性 当常用字典操作为 使用。