Posted by & filed under Uncategorized.

About chen xiang

Xiang Chen has written 52 post in this blog.

1   什么是Zope

现在很流行轻量级开发框架。在python社区,就有Django、Pylons、Quxiote等框架,简单易学好上手。做一个网站,费不了多少功夫就可以完成了,而且集成了很多最新的AJAX效果。

但是在某些情况下,我们需要面对更复杂的应用,需要考虑可重用性,需要组织大规模的开发。这时候,这些轻量级框架,可能就存在一些瓶颈了。比如企业级关键业务系统,比如银行交易等。在Java的世界里面,这些被认为是J2EE的专有领地,虽然有很多Java人不喜欢J2EE的过于复杂。

在Python的世界里面,是否有类似J2EE的企业开发框架?如果有,在以简洁漂亮著称的Python世界里面,他是否也会如同J2EE般的复杂?

恩,我来告诉你:有的,她就是Zope ( http://zope.org ),一个Python上的应用服务器。她比轻量级的web开发框架来得厚重,但远比J2EE开发简单。

2   谁在用Zope?

Zope由来已久,早在1996年就出现了,因此用户是满天下。包括GE、美国海军、波士顿在线等,都在用Zope.

开源内容管理系统 Plone (http://plone.org) 是基于Zope开发的,Plone被很多世界500强的公司以及各国政府所使用,包括美国中情局以及Novell等。

Ubuntu的社区开发站点launchpad(http://launchpad.net), 也是基于Zope开发的。launchpad类似code.google.com,或者sf.net这样的定位。

在国内,易度互联网在线工作平台,http://everydo.com,就是基于Zope开发的。这个平台提供了一组集成个人、部门、工作组、产品和项目工作管理的套件产品,让普通企业利用互联网作为基本工作平台成为可能。

3   ZOPE: 对象发布环境

Zope的完整名字是 Z Object Publishing Environment,也就是Z对象发布环境,这里的Z没有什么特别的意义。这个对象发布环境,是Zope的一个关键特性。

我们来看看一个典型的路径:

传统的web服务应用,会有一个控制器,将上面的URL路径映射到实际的功能模块。这个是以功能为中心的。

但是Zope是完全以对象为中心的,也就是说路径中的products、project都是一个个对象,Zope自身负责对象的定位查找和调用。这个过程,也就是所谓的对象发布过程。

对象发布,是传统Web开发的一个大的变革,她更简单直接。特别是对于内容管理系统,由于内容之间一般存在明显包含关系,这种对象发布模型尤其适合。

4   ZODB: 对象数据库

对象发布环境中,一切都是对象。那么对象如何存储呢?

如果把对象存放到关系数据库中,一定需要一个O-R映射过程。虽然有很多工具来自动化这个适配过程,但是仍然是存在阻抗的。

Zope自带了一个对象数据库ZODB(Z Object Database),允许你直接把对象存放到数据库中。使用对象数据库,真正实现了对象数据存取的零阻抗,你根本不会感知到数据存取的过程!

ZODB也发展了10年多的时间,现在已经非常稳定,已经很成熟了。ZODB可以脱离Zope独立使用。

对象发布,配合ZODB,让开发过程异常简单。

5   ZCA: 组件架构

Zope自身是一个复杂的应用。Zope上的其他应用,比如Plone,更加复杂。

面对复杂应用,我们需要让系统扁平化,减少依赖,降低耦合,提升代码的可重用性。 所有这些内容,也是 设计模式 (Design Pattern) 所关注的课题。

组件开发,正是应对这一需求的应对技术。 微软的COM,Mozilla的xpcom,都是著名的组件开发框架。

Zope也提供了一个组件开发框架 ZCA(Zope Component Architecture),他为Python引入了接口的概念,同时提供了接口注册和查询的机制,使得基于接口而不是实现编程成为可能。

传统的开发是直接基于类开发,这样,和具体的实现就紧密耦合了。接口是功能的契约,实现同一接口的类可能有很多。通过接口开发更加灵活。

在ZCA中,最基本的组件是适配器组件。大部分对象之间的关系,都可以用适配器来描述。在现实生活中,比如显卡就是从PCI接口到VGA接口的适配,电源就是220V交流到9V直流的适配,投影仪就是从200V电源和适配信号到投影光信号之间的多适配。基本上可以说,一切皆适配。这也是ZCA的核心理念。

在适配组件的基础上,ZCA还衍生出工具组件、事件订阅组件等高级组件。这些组件都可以通过XML文件来装配,构成最终的应用。

ZCA是实践设计模式的最佳技术手段。使用ZCA,你根本不需要太多思考,便可解决依赖问题,你可让设计模式成为一种习惯和标准。同时也让经过设计模式处理过的代码不再怪异,让代码的阅读和维护更加轻松。

ZCA是Zope总结经验教训的一个产物,也是Zope最有价值的产品之一。 ZCA可以脱离Zope使用。其实,ZCA其实更应该说是Python的组件开发框架,现在也已经被twisted等项目采纳。

由于Zope内核采用ZCA开发,Zope更加可扩展,这也是Zope适合企业级开发的一个原因。

你可在这里查看ZCA的文档: http://docs.everydo.com/zope3/ca

6   Repoze: 让Zope融入Python世界

我们一直在说Zope厚重。这种厚重,让Zope在Python世界里很另类。很多习惯了简单的python开发人员,不大爱Zope的这种一眼望不见底。

Zope的很多的特性,包括认证、对象发布、事务管理、授权等,功能都很强大,但是几乎无法在Zope世界外使用,这样Zope世界显得有些封闭。

这个现象,其实也不是Zope独自存在的。Python上大量的web框架,大都是各自为政,彼此互通的很少。

WSGI是解决这一问题的途径。WSGI (Web Service Gateway Interface),定义了Web服务器和Web应用以及Web中间件之间的交互协议。 这样,只需要支持WSGI,那么各种web服务器、web应用和中间件,就能相互对接了。比如,你可轻松让你的网站wiki采用MoinMoin,而发布系统采用Plone.

而Repoze(http://repoze.org) 做了什么了呢?Repoze是一个 “拆卸工”,他把复杂/强大的Zope,逐一分解成一个个WGSI组件。这样,Zope基本消失了,Zope的强大特性,可以被Zope外的各种框架所使用。

目前,Zope的可插拔认证系统、Zope的事务管理、对象发布,均被Repoze给WSGI化重写了。Zope坚硬的外壳,已经被Repoze敲开,营养已经被Repoze所吸收,Repoze太狠了!

Repoze又推出了自己的开发框架repoze.bfg(http://static.repoze.org/bfgdocs/) ,这个是利用了ZCA的一个可以一眼见底”轻量级”开发框架,和pylons和Django有神似的地方。

Repoze.bfg实际上是Zope的一个分支,Repoze.bfg未来非常值得期待。虽然现在还处在早期,但是早有蜻蜓落上头,已经有很多应用基于Repoze.bfg开发了。我相信,Repoze是Zope的终极出路,是众望所归。

7   Zope曲折史

Zope发展其实有一段曲折的历程,如同Z字的形状,一波三折。

Zope第一个辉煌,是突破了传统CGI编程的复杂性,推出了直接通过浏览器进行脚本开发,这大大简化的web开发过程。然而脚本开发存在不方便代码管理的问题,很多开发设计模式无法用上。大量轻量级开发框架的普及,逐步淡化了这一特性。但是目前在Plone中,直接通过浏览器进行定制,仍然是Plone的关键特性之一。

Zope第二个辉煌,应该是Plone内容管理系统的流行,Plone的流行,让Zope的用户和开发人员迅速扩展。Plone是基于Zope内容管理框架CMF开发的。

Zope第三个辉煌,应该是Zope3的推出。Zope3是对Zope从前版本的重写,组件架构ZCA就是在这个版本中引入的。但是由于Zope3面对的是复杂应用,这种曲高导致了和寡。Zope在整个Python社区并不十分流行。特别是在现在ROR/Django势强,而J2EE势微的年头。

现在正在走入第四个辉煌,那就是Zope3的轻量级化,让Zope3成为每个开发人员的挚爱。Grok(http://grok.zope.org) ,就是一个尝试,他模仿了ROR的很多概念,开发过程简单很多,不再需要配置XML文件。前面提到的repoze.bfg,则是另外一个尝试,bfg并不忌讳XML,因为他的配置XML很简单,我个人更看好bfg的前途。

8   如何上手?

Zope的世界太庞大,你困惑了吗?

恩,如果你喜欢Pylons的简洁,你是一个思维严谨的开发人人员,你希望一切都可操控,那建议你选择repoze.bfg,他会让你满足。

如果你在开发一个想当复杂的、相当严肃的应用,你还是选择 Zope3吧。Zope 3有几乎所有你想要的东西,该走的弯路,别人都走过了,你可省很多力气。 当然你需要有一个可以相互学习的团队,需要准备一定的入门门槛过程。

如果你只是想做一个网站,那选择Plone吧,这个是专业级别的,你只需要掌握一些定制技术。

你根本不做web开发?哦,那你去看看ZODB、ZCA吧,相信他们会对你有益的。

Leave a Reply

  • (will not be published)