文件系统代码和ttw等内容类型的框架(zope/cmf/plone)

plone.dexterit的Python项目详细描述


灵巧性

< Buff行情> "相同,相同,但不同"

dexterity是一个通过web和文件系统代码构建内容类型的系统。 它的目标是plone,尽管这个包应该与普通的zope+cmf系统一起工作。

关键用例

灵巧想让一些事情变得简单。这些是:

  • 完全通过网络创建"真实"的内容类型,而无需知道编程。
  • 作为业务用户,使用可视化或通过web工具创建一个模式,并使用适配器、事件处理程序和python程序员在文件系统上编写的其他python代码对其进行扩充。
  • 在文件系统代码中快速、轻松地创建内容类型,而不丧失在需要时自定义类型的任何方面及其操作的能力。
  • 支持以声明方式对自定义类型启用的常规"行为"。 行为可以是标题到ID的命名、对锁定或版本控制的支持,或者是带有相关UI元素的标准元数据集。
  • 轻松打包和分发通过Web、文件系统或两者结合定义的内容类型。

哲学

灵巧的设计有一个特定的理念。 总结如下:

< DL>
再利用大于再创造
灵巧性应该尽可能重用已经存在的组件和技术。 然而,更重要的是,敏捷性应该重用其他地方存在的概念。 通过类比学习灵巧性应该很容易,使用熟悉的api和技术处理灵巧性类型也应该很容易。
小大于大
超级框架是该死的。 灵巧性由许多专门的包组成,每个包都是独立测试和可重用的。 此外,包应该具有尽可能少的依赖项,并且应该显式地声明它们的依赖项。 这有助于保持设计的整洁和代码的可管理性。
过度普遍性的自然交互作用
灵巧性设计是由几个用例(见docs/design.txt)驱动的,这些用例表达了我们希望人们使用灵巧性的方式。 最终目标是通过逐步学习和自然的交互模式,使之易于开始,但也易于从最初的原型发展到复杂的类型集和相关行为集。 灵巧的目标是考虑它的用户——无论是业务分析师、轻量级集成商还是python开发人员,无论他们是新手还是有经验的人——并以明显的、有案可稽的、自然的交互模式明确地迎合他们。
实际代码多于生成的代码
生成的代码很难理解,如果不能按预期工作,则很难调试。 很少有理由(如果有的话)乱写python代码的方法或"exec"字符串。
zca超过旧zope 2
尽可能多的组件应该使用纯zca(zope组件架构, zope.* 源于zope 3的包)。 尽管灵巧并不假装与非cmf系统一起工作, 即使在依赖zope 2、cmf或plone的地方,它们也应该——只要实际可行——遵循zca技术和最佳实践。 许多操作(例如,管理文件夹中的对象、创建新对象或通过定义的模式操作对象)在 ZCA比他们在Zope 2的时候要好。
zope概念胜过新范式
我们希望灵巧是"zope-ish"(实际上是"zca-ish")。 Zope是一个成熟的、设计良好的(主要是)和经过测试的平台。 如果我们能提供帮助,我们不想发明全新的范例和技术。
一厢情愿的自动化测试
"所有"都应该由自动化测试覆盖。 灵巧一定有很多活动部件。 未经测试的运动部件倾向于失去并落在人们的头上。 没人喜欢。

怎么回事?

把华夫饼放在一边,让我们更详细地了解一下 在灵巧系统中组成"内容类型"。

< DL>
模型
灵巧的"模型"描述了类型的模式和与这些模式相关联的元数据。 模式只是一系列字段,可用于呈现添加/编辑表单并内省给定类型的对象。 元数据存储可通过组件体系结构进行扩展。 典型的元数据形式包括ui提示,例如指定呈现特定字段时要使用的小部件类型,以及每个字段的安全设置。

模型也用xml描述。 尽管在运行时,它是一个对象的实例,该对象提供来自 plone.supermodel 的imodel接口。 模型中的schemata是与 zope.schema 字段的接口。

如果一个类型是通过web创建的,那么这个模型可以作为数据存在于zodb中。 或者,也可以从文件中加载。 XML表示旨在为人类可读和自文档化。 它还设计了类似于agx的工具,这些工具可以从可视表示中生成模型。

模式

所有内容类型都至少有一个(未命名)架构。 模式只是一个带有zope.schema字段的接口。 该模式可以在python代码中指定(在这种情况下,它只是通过名称引用),也可以从xml模型加载它。

未命名的架构也称为icontenttype架构。 在这种情况下,schema接口将提供zope icontenttype接口。 这意味着,如果对灵巧内容对象调用 queryContentType() ,则应返回其未命名的架构,该架构应由查询的对象提供。 因此,对象将直接支持模式承诺的属性。 这使得灵巧的内容对象成为"pythonic",并且易于使用。

当然,所有内容对象都是特定类的实例。 它很容易提供您自己的类,并且灵巧性有方便的基类供您使用。 但是,许多类型根本不需要类。 相反,他们将使用标准的灵巧"item"和"container"类。

dexterity的内容工厂将使用类型的内容模式中的字段初始化其中一个类的对象。 工厂将确保对象提供相关接口,包括架构接口本身。

向灵巧内容对象添加行为和逻辑的首选方法是通过适配器。 在这种情况下,您可能需要schema接口的文件系统版本(如果您 希望如此,但它将有一个带有真实模块路径的接口),您可以对其注册组件。

工厂

灵活内容是使用名为utility的标准zope ifactory构建的。 按照惯例,工厂实用程序与内容类型的门户类型同名。

当创建灵活的fti(工厂类型信息,见下文)时,除非已存在具有该名称的工厂,否则会将相应的工厂注册为本地实用程序。

默认工厂能够初始化泛型 容器 对象以显示内容类型架构,并在类型的模型中指定安全性和其他方面。 如果您愿意,您可以使用它,或者提供您自己的工厂。

视图

默认情况下,灵巧性将创建: -添加视图(注册为本地实用程序,因为在确定要呈现的字段时,它需要考虑内容类型的门户类型)和 -编辑视图(注册为通用全局视图,在运行时检查上下文的门户类型)类型。 -存在一个默认主视图,它只输出上下文中设置的字段。

要注册新视图,通常需要一个文件系统架构接口。 然后,您可以像平常一样注册此界面的视图。

如果需要覆盖默认的添加视图,请创建一个与内容类型的门户类型相对应的名称用于iadding的视图。 这将防止在创建fti时灵活地使用相同的名称注册本地视图。

工厂类型信息(fti)

fti保存关于内容类型的各种信息。 灵巧框架执行的许多操作都是从查找类型的fti开始的,以查找有关类型的一些信息。

fti是存储在zmi中portal_类型中的对象。 大多数设置可以通过网络更改。 有关详细信息,请参阅idexterityfti接口。

创建灵活的fti时,事件处理程序将创建一些本地组件,包括factory实用程序和为新类型添加视图。fti本身也注册为一个命名实用程序,以便使用如下语法查找:

getUtility(IDexterityFTI, name=portal_type)

fti也可以使用genericsetup完全导入和导出。 因此,创建和分发内容类型的最简单方法是创建一个新的fti,设置一些属性(包括有效的xml模型, 如果没有要使用的文件或架构接口,则可以输入ttw,并将其导出为genericsetup扩展配置文件。

行为

行为是一种写操作生成可重用功能位的方式,可以在每种类型的基础上打开或关闭。 示例可能包括通用元数据或通用功能,如锁定、标记或分级。

行为是使用plone.behavior包实现的。 有关如何编写自己的行为的详细信息,请参阅其文档。

在灵巧性方面,行为可以将字段"注入"到标准的添加和编辑表单中,并且可以为新创建的对象提供标记接口。 有关提供表单字段的行为示例,请参阅example.dexterity包。

在使用中,行为本质上只是一个适配器,只有在被调整对象的fti中启用了该行为时,该适配器才会显示为已注册。 因此,如果有my.package.imybehavio描述的行为,则通常通过执行以下操作与此行为交互:

my_behavior = IMyBehavior(context, None)
if my_behavior is not None:
    ...

给定类型的启用行为将作为虚线接口名称的列表保存在fti中。

灵巧生态系统

灵巧系统包括许多软件包,其中大部分是 独立可重复使用。此外,灵巧使用了许多组件 Zope和CMF。

最重要的软件包是:

< DL>
plone.dexterity (cmf)
此包定义fti和内容类。 它提供基本视图(基于z3c.form的表单)、处理安全性等。 它还提供组件来协调上述软件包提供的各种功能,以便将灵巧的系统组合在一起。
plone.behavior (zca)

支持"条件"适配器。产品作者可以通过一个简单的适配器编写和注册通用行为。 适配器似乎已注册为具有可用命名行为的类型。

灵巧性将其连接起来,使得启用的行为列表作为属性存储在fti中。 这使得通过web添加/删除行为或在安装时使用genericsetup变得容易。

plone.folder(CMF)
这是一个有序的btree-backed文件夹的实现,带有zca 字典式语义用于管理文件夹中的内容项。 标准灵活的"container"类型使用plone.folder作为基础。
plone.autoform (cmf,z3cform)
包含帮助函数,用于基于存储在架构接口上的标记值构造窗体。
plone.supermodel (zca)

支持从/到xml的接口解析和序列化。 XML格式直接基于描述zope.schema类型字段的接口。 因此,它很容易扩展到新的字段类型。 这还有一个额外的好处,就是zope.schema包中的接口文档也适用于xml格式。

supermodel可以通过适配器和xml名称空间进行扩展。 plone.dexterity使用它允许安全性和ui提示作为元数据嵌入到xml模型中。

plone.alterego (巨蟒)

支持动态模块,可以动态创建对象。 dexterity使用它为仅通过web存在的类型生成"真实"接口。 这允许这些类型具有正确的IContentType架构。 它还允许为此接口注册本地适配器(例如,带有通过Web定义的模板的自定义视图)。

请注意,如果类型使用文件系统接口(无论是手动编写还是从XML模型加载),则不使用此模块。

plone.app.dexterity (plone)
这个包包含plone灵活性的所有特定方面,包括ploneish ui组件、行为和默认值。

开发人员手册

《敏捷开发者手册》是一个完整的文档,其中包含了一些实际的例子,也是官方plone文档的一部分。

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

推荐PyPI第三方库


热门话题
Java泛型重写抽象方法并具有子类的返回类型   Java中的字符串反转字符,同时保留一些字符   java将系统时间与我获取它的时间进行比较   java解析ODATA URL以在准备entityset之前读取ID值   java中的有界通配符下界泛型即使在传递超类时也不会编译   c#Java的JVM和Java的内部工作方式有什么不同。NET的CLR?   java如何在windows7上指定JDK的版本?   Java:列出单个目录中的所有文件(1020000+)   java使用Logback和Lombok   安卓谷歌玩java。lang.NullPointerException   使用RSA的解密结果在普通Java和Android中有所不同   具有默认连接池的java Spring引导   java我如何在一个坏的测试环境中前进?