zope组件架构的本地注册中心
zope.site的Python项目详细描述
zope.site网站
此包提供本地和持久站点管理器 实现,以便可以注册本地实用程序和 适配器。它使用本地适配器注册表作为适配器和实用程序 注册表。该模块还提供了一些工具来组织 本地软件并确保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) True0
>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True1
接下来,让我们看看是否也可以成功地将适配器注册为 好。适配器将提供文件大小:
< Buff行情>>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True2
>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True3
>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True4
>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True5
现在我们有了适配器,我们需要注册它:
< Buff行情>>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True6
最后,我们可以为文件获取适配器:
< Buff行情>>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True7
顺便说一下,一旦你设置了一个站点
< Buff行情>>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True8
您只需使用zope.component的 getsitemanager()方法 最近的站点管理员:
< Buff行情>>>> from zope.component.interfaces import ISite, IPossibleSite >>> IPossibleSite.providedBy(myfolder) True9
这也意味着您可以简单地使用zope.component查找实用程序
< Buff行情>>>> ISite.providedBy(myfolder) False0
或者适配器通过接口的 调用方法:
< Buff行情>>>> ISite.providedBy(myfolder) False1
多个站点
到目前为止,我们只处理了一个本地和全球网站。但事情 一旦我们有了多个网站,就会变得很有趣。我们可以超越其他人 本地配置。
这种行为使用位置的概念,因此我们需要配置 首先是zope.location包:
< Buff行情>>>> ISite.providedBy(myfolder) False2
现在,我们创建一个名为 folder11 的新文件夹,将其添加到 myfolder 并使 它是一个站点:
< Buff行情>>>> ISite.providedBy(myfolder) False3
如果我们向第二个站点经理询问下一个站点,我们将得到
< Buff行情>>>> ISite.providedBy(myfolder) False4
第一个现场经理应该有一个主管副经理:
< Buff行情>>>> ISite.providedBy(myfolder) False5
如果我们现在使用相同的名称注册第二个实用程序,并使用 新建站点管理器文件夹,
< Buff行情>>>> ISite.providedBy(myfolder) False6
>>> ISite.providedBy(myfolder) False7
然后它将在第二个站点管理器中可用
< Buff行情>>>> ISite.providedBy(myfolder) False8
但不是第一个:
< Buff行情>>>> from zope.site import folder >>> myfolder = folder.rootFolder()9
查看移动和复制 站点。为此,我们创建第二个根文件夹并使其成为站点,以便 站点层次结构如下:
>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass0
在移动或复制站点之前,我们需要注册两个事件订阅服务器 用于管理移动或复制后站点管理器的连接:
< Buff行情>>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass1
我们只需要注册一个事件侦听器,因为复制操作会导致 要创建的iobjectaddedevent,它只是 iobjectmovedevent
首先,首先确保所有设置都正确:
< Buff行情>>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass2
现在让我们把MyFolder11从MyFolder移动到MyFolder2 < Buff行情>
>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass3
现在,myfolder11的下一个站点管理器应该已经更改了:
< Buff行情>>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass4
确保我们的接口和类是可选择的:
< Buff行情>>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass5
>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass6
>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass7
最后,让我们检查一下当我们的文件夹被移动时,g工作正常 到不包含任何站点管理器的文件夹。我们的文件夹 site manager的基数应设置为global site manager。
< Buff行情>>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass8
>>> from zope import site >>> class MyContentComponent(site.SiteManagerContainer): ... pass9