zope组件架构的本地注册中心

zope.site的Python项目详细描述


zope.site网站

最新版本支持的python版本https://travis-ci.org/zopefoundation/zope.site.svg?branch=masterhttps://coveralls.io/repos/github/zopefoundation/zope.site/badge.svg?branch=master文档状态

此包提供本地和持久站点管理器 实现,以便可以注册本地实用程序和 适配器。它使用本地适配器注册表作为适配器和实用程序 注册表。该模块还提供了一些工具来组织 本地软件并确保zodb内的正确行为。

文档的宿主位置是https://zopesite.readthedocs.io" rel="nofollow">https://zopesite.readthedocs.io

站点和本地站点管理器

这是基于位置的组件体系结构的介绍。

创建和访问站点

站点 用于为 应用程序或网站。每个文件夹:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()

有潜力成为网站:

< Buff行情>
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True

但还不是一个:

< Buff行情>
>>> ISite.providedBy(myfolder)
False

如果希望自定义内容组件能够成为站点, 您可以使用 sitemanagercontainer mix in class:

< Buff行情>
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
>>> myContent = MyContentComponent()
>>> IPossibleSite.providedBy(myContent)
True
>>> ISite.providedBy(myContent)
False

要将可能的站点转换为真实站点,我们必须提供一个站点管理器:

< Buff行情>
>>> sm = site.LocalSiteManager(myfolder)
>>> myfolder.setSiteManager(sm)
>>> ISite.providedBy(myfolder)
True
>>> myfolder.getSiteManager() is sm
True

请注意,创建本地站点管理器时会生成事件:

< Buff行情>
>>> from zope.component.eventtesting import getEvents
>>> from zope.site.interfaces import INewLocalSite
>>> [event] = getEvents(INewLocalSite)
>>> event.manager is sm
True

如果试图设置一个虚假的站点管理器,则会引发一个 值错误

< Buff行情>
>>> myfolder2 = folder.Folder()
>>> myfolder2.setSiteManager(object)
Traceback (most recent call last):
...
ValueError: setSiteManager requires an IComponentLookup

如果可能的站点已更改为站点,则a typeerror 当试图添加新站点管理器时引发:

< Buff行情>
>>> myfolder.setSiteManager(site.LocalSiteManager(myfolder))
Traceback (most recent call last):
...
TypeError: Already a site

还有一个适配器可用于从任何 位置:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
0

如果传递的位置是站点,则返回该站点的站点管理器:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
1

使用站点管理器

站点管理器包含多个站点管理文件夹,用于 逻辑地组织软件。当站点管理器初始化时,默认值为 已创建站点管理文件夹:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
2

但是,你c不在上创建默认站点管理器文件夹的通知 localsitemanager创建:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
3

另外,请注意,在创建localsitemanager时,其父级设置为 已传递给构造函数的站点,并且将"uu name"设置为"+"etc++站点。

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
4

您可以轻松创建新的站点管理文件夹:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
5

一旦你有了网站管理文件夹-让我们使用默认文件夹-我们 可以注册一些组件。让我们从实用程序开始:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
6
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
7

现在我们可以创建一个实用程序的实例并将其放到站点中 管理文件夹并注册:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
8

现在我们可以向站点管理器请求实用程序:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
9

当然,本地站点管理器也可以访问全局组件 注册:

< Buff行情>
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
0
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
1

接下来,让我们看看是否也可以成功地将适配器注册为 好。适配器将提供文件大小:

< Buff行情>
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
2
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
3
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
4
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
5

现在我们有了适配器,我们需要注册它:

< Buff行情>
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
6

最后,我们可以为文件获取适配器:

< Buff行情>
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
7

顺便说一下,一旦你设置了一个站点

< Buff行情>
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
8

您只需使用zope.component的 getsitemanager()方法 最近的站点管理员:

< Buff行情>
>>> from zope.component.interfaces import ISite, IPossibleSite
>>> IPossibleSite.providedBy(myfolder)
True
9

这也意味着您可以简单地使用zope.component查找实用程序

< Buff行情>
>>> ISite.providedBy(myfolder)
False
0

或者适配器通过接口的 调用方法:

< Buff行情>
>>> ISite.providedBy(myfolder)
False
1

多个站点

到目前为止,我们只处理了一个本地和全球网站。但事情 一旦我们有了多个网站,就会变得很有趣。我们可以超越其他人 本地配置。

这种行为使用位置的概念,因此我们需要配置 首先是zope.location包:

< Buff行情>
>>> ISite.providedBy(myfolder)
False
2

现在,我们创建一个名为 folder11 的新文件夹,将其添加到 myfolder 并使 它是一个站点:

< Buff行情>
>>> ISite.providedBy(myfolder)
False
3

如果我们向第二个站点经理询问下一个站点,我们将得到

< Buff行情>
>>> ISite.providedBy(myfolder)
False
4

第一个现场经理应该有一个主管副经理:

< Buff行情>
>>> ISite.providedBy(myfolder)
False
5

如果我们现在使用相同的名称注册第二个实用程序,并使用 新建站点管理器文件夹,

< Buff行情>
>>> ISite.providedBy(myfolder)
False
6
>>> ISite.providedBy(myfolder)
False
7

然后它将在第二个站点管理器中可用

< Buff行情>
>>> ISite.providedBy(myfolder)
False
8

但不是第一个:

< Buff行情>
>>> from zope.site import folder
>>> myfolder = folder.rootFolder()
9

查看移动和复制 站点。为此,我们创建第二个根文件夹并使其成为站点,以便 站点层次结构如下:

>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
0

在移动或复制站点之前,我们需要注册两个事件订阅服务器 用于管理移动或复制后站点管理器的连接:

< Buff行情>
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
1

我们只需要注册一个事件侦听器,因为复制操作会导致 要创建的iobjectaddedevent,它只是 iobjectmovedevent

首先,首先确保所有设置都正确:

< Buff行情>
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
2

现在让我们把MyFolder11从MyFolder移动到MyFolder2 < Buff行情>

>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
3

现在,myfolder11的下一个站点管理器应该已经更改了:

< Buff行情>
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
4

确保我们的接口和类是可选择的:

< Buff行情>
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
5
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
6
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
7

最后,让我们检查一下当我们的文件夹被移动时,g工作正常 到不包含任何站点管理器的文件夹。我们的文件夹 site manager的基数应设置为global site manager。

< Buff行情>
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
8
>>> from zope import site
>>> class MyContentComponent(site.SiteManagerContainer):
...     pass
9

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

推荐PyPI第三方库


热门话题
java接口中的每个方法都是抽象的,但在抽象类中,我们也只能使用抽象方法   初始化Java中声明的、未初始化的变量会发生什么情况?   java BouncyCastle openPGP将字节[]数组加密为csv文件   在Java中将类A(和所有子类)映射到类B的实例的字典   RSA公钥编码,在Java和Android中,代码相同,结果不同   java在安卓中实现数字检测语音识别   java取消选择复选框   java如何在其他配置中重用Maven配置XML片段   java有没有一种有效的方法来检查HashMap是否包含映射到相同值的键?   spring处理程序调度失败;嵌套的例外是java。lang.NoClassDefFoundError:org/apache/http/client/HttpClient   带有ehcache的java多层缓存   java如何访问chromium(或任何其他浏览器)cookie   java通过将两个集合与spring data mongodb data中的条件合并来获取计数   安卓中R.java的语法错误