跳转到主要内容

另一个ZODB连接中对象的挂载点的简单实现。

项目描述

ZODB挂载点

本包提供了一个非常简单的ZODB连接中对象挂载点的实现。如果您在zope.conf配置文件中定义了多个连接或在Python代码中定义了多个数据库,您可以使用此包在另一个数据库的任何位置挂载任何数据库中的对象。

让我们以典型的Zope 3应用程序布局开始,创建两个数据库。

>>> from ZODB.tests.test_storage import MinimalMemoryStorage
>>> from ZODB import DB
>>> from zope.site.folder import rootFolder, Folder
>>> import transaction
>>> dbmap = {}
>>> db1 = DB(MinimalMemoryStorage(), database_name='db1', databases=dbmap)
>>> conn1 = db1.open()
>>> conn1.root()['Application'] = rootFolder()
>>> db2 = DB(MinimalMemoryStorage(), database_name='db2', databases=dbmap)
>>> conn2 = db2.open()
>>> conn2.root()['Application'] = rootFolder()
>>> transaction.commit()

现在,让我们在第二个数据库中添加一个子文件夹,它将作为我们希望挂载的对象。

>>> conn2.root()['Application']['Folder2-1'] = Folder()
>>> transaction.commit()

我们现在可以创建一个挂载点。

>>> from z3c.mountpoint import mountpoint
>>> mountPoint = mountpoint.MountPoint(
...     'db2', objectPath=u'/Folder2-1', objectName=u'F2-1')

构造函数的第一个参数是数据库的连接名称,第二个参数是挂载DB中挂载对象的路径,对象名称是对象挂载的名称。

现在我们可以将挂载点添加到第一个数据库中。

>>> conn1.root()['Application']['mp'] = mountPoint
>>> transaction.commit()

现在我们可以按照以下方式访问挂载对象

>>> conn1.root()['Application']['mp'].object
<zope.site.folder.Folder object at ...>

注意,对象名称尚未使用;它仅用于遍历。

遍历

所以,让我们看看遍历。在能够遍历之前,我们需要注册特殊的挂载点遍历器

>>> import zope.component
>>> zope.component.provideAdapter(mountpoint.MountPointTraverser)

现在我们应该能够遍历到挂载对象

>>> from zope.publisher.browser import TestRequest
>>> req = TestRequest()
>>> from zope.traversing.publicationtraverse import PublicationTraverser
>>> traverser = PublicationTraverser()
>>> traverser.traversePath(req, conn1.root()['Application'], 'mp/F2-1')
<zope.site.folder.Folder object at ...>

当我们远程添加新对象时,它也可以通过挂载点访问

>>> conn2.root()['Application']['Folder2-1']['Folder2-1.1'] = Folder()
>>> transaction.commit()
>>> tuple(traverser.traversePath(
...    req, conn1.root()['Application'], 'mp/F2-1').keys())
(u'Folder2-1.1',)

默认情况下,对象引用它们的原始路径

>>> f211 = traverser.traversePath(
...    req, conn1.root()['Application'], 'mp/F2-1/Folder2-1.1')
>>> from zope.traversing.browser import absoluteurl
>>> absoluteurl.absoluteURL(f211, req)
'http://127.0.0.1/Folder2-1/Folder2-1.1'

此包通过包装所有对象为特殊远程位置代理并提供针对这些代理的特殊包装遍历器来解决该问题

>>> from z3c.mountpoint import remoteproxy
>>> zope.component.provideAdapter(remoteproxy.RemoteLocationProxyTraverser)
>>> f211 = traverser.traversePath(
...    req, conn1.root()['Application'], 'mp/F2-1/Folder2-1.1')
>>> absoluteurl.absoluteURL(f211, req)
'http://127.0.0.1/mp/F2-1/Folder2-1.1'

更新挂载点

每当挂载点上的任何属性被修改时,挂载对象都会更新。例如,当对象路径更改时,对象也会相应调整。这是通过事件订阅器完成的

>>> mountPoint.objectPath = u'/Folder2-1/Folder2-1.1'
>>> modifiedEvent = object()
>>> mountpoint.updateMountedObject(mountPoint, modifiedEvent)
>>> f211 == mountPoint.object
True

变更日志

0.1 (2010-08-03)

  • 初始发布。

项目详情


下载文件

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

源分布

z3c.mountpoint-0.1.tar.gz (8.8 kB 查看哈希值)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页