在 ZODB 上:
另一种问“ZODB 的真正目的是什么?”的方式。就是要问,“ZODB 最初为什么要创建?”
答案是这个项目很早就开始了,大约在 1996 年左右。那是在 MySQL 或 PostgreSQL 出现之前,当时 miniSQL(一种免费但不是免费的软件)数据库仍然普遍使用,或者说是大笔资金Oracle 等数据库。Python 提供了 pickle 模块来将 Python 对象序列化到磁盘 - 但序列化级别较低,它不允许事务、并发写入和复制等功能。这就是 ZODB 提供的。
它今天仍在 Zope 中使用,因为它运行良好。如果您没有关系数据库方面的现有技能,学习使用 ZODB 比使用关系数据库更容易。它也适用于更简单的用例,例如,如果您有一个需要存储一些配置信息的命令行脚本,则使用关系数据库意味着必须运行数据库服务器来存储一些配置信息。您可以使用配置文件,但 ZODB 也可以很好地工作,因为它是一个可嵌入的数据库。这意味着数据库与其他 Python 代码在同一进程中运行。
还值得注意的是,Zope 2 和 Zope 3 用于在容器中存储对象的 API 是不同的。在 Zope 2 中,容器作为属性存储:
root.mycontainer.myattr
在 Zope 3 中,它们使用与 Python 标准字典类型相同的接口:
root['mycontainer']myattr
这是学习使用 ZODB 比学习 Django ORM 更容易的另一个原因,因为 Django 有自己的 ORM 接口,这与 Python 现有的接口不同。
通过网络(TTW):
同样,了解 TTW 的原因可以追溯到 Zope 开发时。虽然与 Subversion 或 Mercurial 等知名开发工具决裂似乎很愚蠢,但 Zope 是在 90 年代后期开发的,当时唯一的免费版本控制系统是 CVS。Zope 2 有它自己的简单版本控制功能,它们和 CVS 一样好(也就是说,“它们是有限的和糟糕的。”)。那时 UNIX 工作站的成本要高得多,而且资源要少得多,因此系统管理员对服务器的管理方式更加谨慎和谨慎。TTW 允许那些通常无法通过系统管理员干预将代码上传到服务器的人来做到这一点。
使用文本编辑器,emacs 和 vi 具有 ftp 模式,Zope 2 可以侦听 FTP 端口。这将允许您进行开发,以便将代码存储在 ZODB(可编辑 TTW)中,但通常使用 emacs 或 vi 编辑此代码。
今天在 Zope 中,TTW 很少使用或推广,因为这样做不再有意义。磁盘空间便宜,服务器(相对)便宜,并且有许多开发人员工具希望与标准文件系统进行交互。
获得:
那是一个错误。这是一个非常令人困惑的功能,导致许多意想不到的事情发生。理论上有一些有趣的获取想法,但在实践中最好扔进垃圾箱,几乎没有实际用途。
从 Django 迁移到 Zope:
Zope 3 的工作于 2001 年开始。这解决了 Zope 2 的许多问题。Zope 社区证明了 Zope 2 仍然活跃且维护良好,但它几乎不是最先进的。Zope 2 真的只有从历史的角度来学习才有趣。
Zope 3 最终向几个不同的方向发展,因此 Zope 的现代化身最好以 Grok、BFG 或 Bobo 的形式表达。
Grok 最接近 Zope 3,因此是一个相当大的框架——在深入研究它的代码库时,它有时会让人不知所措。但是,就像 Django 或任何其他您不需要使用 Grok 的每个部分的全栈框架一样,学习基础知识并使用它创建 Web 应用程序非常容易。它的约定优于配置是首屈一指的,它基于类的视图给它一个比 Django Web 应用程序更紧凑、可以说更干净的代码库。它的 URL 路由系统非常灵活,但也可以说是过度设计的。
BFG 是由 Zope 长期开发人员 Chris McDonough 编写的“只为你吃的东西付费”的框架。因此,它在精神上更接近 Pylons,其中仅包含被认为是框架核心或必不可少的部分。它也与 WSGI 配合得很好。它只使用了几个核心 Zope 包。
Bobo 是一个“微框架”。这只是路由 URL 和提供应用程序的一种方式。它不使用任何 Zope 包,因此严格来说不属于 Zope 系列 Web 框架。但它是由 Zope 的创建者 Jim Fulton 编写的,他最初将 Zope 的出版部分称为“Bobo”。最初的 Bobo 写于 90 年代初期,将 URL 映射到包和模块,所以如果您的源代码布局为:
mypackage.mymodule.MyClass
您可以有一个 URL,例如:
/mypackage/mymodule/MyClass
这非常不灵活,在 Zope 2 中被相当复杂的 URL Traversel 取代。Bobo 使用路由,因此它是非常简单的 URL 解析和复杂的 URL 解析之间的中间地带 - 与 Django 的 URL 解析机制的复杂性大致相同。