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 Spring异步任务返回未来   java如何显示数据库中的下一条记录   java这些读取用户输入的方法有什么不同?   java Spring+Spring安全请求只接受contenttype xwwwformurlencoded   checkName()和将用户输入存储到ArrayList和boolean[]的java问题   java如何使用JPA和Facade?   java Neo4j类型不匹配   java如何依赖Maven的系统包?   通过FileChooser保存pdf格式会提示在java中出现第二个对话框   java如何将通量链接到另一个通量/单声道并应用另一个背压?   java如何修复安卓 studio中的权限错误?   尝试清除JavaFX ObservableMap时出现java ConcurrentException   java编辑文本。GetText,返回关于null引用的异常,但已声明该异常   mysql组织。乔达。时间LocalDate在Redhat(Linux)java上显示少一天   在java中通过序列化获取多个对象   有人有java注释“java.lang.Synthetic”的背景吗?