Zope会议

zope.app.session的Python项目详细描述


此包提供会话支持。

Zope3会话实现

注意

此包提供的所有接口和实现 已迁移到zope.session。这个包裹现在 仅提供ZMI菜单配置。

概述

小心!

会话数据在服务器上维护。这就保证了 优点是我们可以假设客户没有篡改 数据。然而,这可能对可伸缩性有重大影响 因为过于频繁地修改会话数据可能会带来很大的负载 在服务器上和极端情况下会使您的站点不可用。 开发人员在编写代码或风险时应牢记这一点 在生产环境中运行应用程序时出现的问题。

需要写密集型会话实现的应用程序(例如 作为页面计数器)应考虑使用cookies或专用的 会话实现。

会话允许我们通过无状态协议(http)伪造状态。 我们通过在多个 http请求,不管是cookie还是某个id被破坏到url中。

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选择应该由哪个ISessionDataContainer使用 使用包ID作为命名实用程序查找。 站点管理员配置会话数据的实际位置 通过添加所需^{tt5}的注册来存储$ 用正确的名字。

>>> 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'

如果没有ISessionDataContainer实用程序,则可以使用 包id,则未命名的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

页面模板

Session data may be accessed in page template documents using TALES:

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

or:

<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>

更改

4.1.0(2018-10-22)

  • 添加对Python3.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)

  • 修正了测试中的拆卸错误。

3.5.1(2007-10-31)

  • 解决ZopeSecurityPolicy弃用警告。

3.5.0(2007-09-27)

  • 覆盖未标记的未读内容的释放Oned开发人员发布 download.zope.org/distribution

3.4.3(2007-09-27)

  • 修复包元数据。

3.4.2(2007-09-24)

  • 更换有问题的鸡蛋
  • 已将缺少的依赖项添加到zope.session

3.4.1(2007-09-24)

  • 将丢失的文件添加到egg分发中

3.4.0(2007-09-24)

  • 初始文件发布

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java找不到当前线程的会话   同步Java同步方法调用非同步方法   这段代码的java时间复杂度是如何列出一个集合的所有子集的?   java Jetty SslConnectionFactory nextProtocol   为什么在java集合中使用游标而不是for循环   java如何对长函数进行单元测试?   如何从java中的文本输入创建数组   java工具栏内容未显示,尽管出现了片段内容   java MediaPlayer无法处理本地文件   java在多次读取时,从TCP服务器读取的数据将挂起   java组织。springframework。数据领域无法将PageImpl强制转换为   java如何使用@WithMockUser并从属性文件中传递用户名和密码?   JavaSpringBootGradle插件2。x如何使用自定义启动器布局工厂   sockets Java客户端和服务器之间使用字符串等进行通信的“行业标准”方法是什么   java变量引用不存在的资源:${project\u loc:project\u name}   搜索如何返回LDAP Java中所有用户的特定属性?   JDK1.8.016x的java密钥斗篷代理问题   spring如何使用Java中的Exchange获取邮件   java Kotlin+Dagger 2:Dagger*文件不会生成   如何在传入的double上执行操作,然后在Java中返回