为另一个zodb连接中的对象实现挂载点非常简单。
z3c.mountpoint的Python项目详细描述
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')
构造函数的第一个参数是数据库的连接名, 第二个参数是挂载数据库中挂载对象的路径 而对象名是对象装入时使用的名称。
现在我们可以将装入点添加到第一个数据库:
>>> 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)
- 初次发布。