为另一个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)

  • 初次发布。

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

推荐PyPI第三方库


热门话题
java使用prepared语句在oracle中插入日期   对点具有双重值的java   使用多个通配符的java请求映射   java Springboot为什么要设置springbootstartertomcat   除了对JavaBean的请求之外,还使用servletContext的servlet   java如何清除OCSID。返回到池的连接时的CLIENTID JDBC客户端信息属性   将整型数组转换为光栅Java   java使用对象引用作为互斥锁   java为什么在编程语言中使用sin函数返回奇怪的sin值不像计算器   java如何将JButton链接到对象并调用相关方法   php用Java发送POST数据   导航属性的java模拟加载   java多个活动错误Android试图对空对象引用调用虚拟方法“”   java Android更改ActionBar文本颜色   如何使用带有java反射且不带开关的parant引用创建子类