• 由 徐永久 发表于 10月16日 11:42

-- Zoom.Quiet [2004-08-09 23:25:02]

1. 面向对象的Web服务器---Zope

本文从网站开发者的角度,简要介绍了 Zope 的强大功能。对于网站开发人员来说是不可或缺的知识性文章。对于想要了解面向对象的 Web 编程人员来说,或许你会丢弃 ASP,PHP,JSP,转而对 Zope 投怀送抱。

1.1. 介绍

Zope 是下一代开放源码应用服务器以及门户工具,由Digital Creations 开发,已经拥有一群相当活跃的用户社群。它既可以在所有Unix 平台上运行,也能在 Windows NT 上运行,不但能集成到其他流行的 Web 服务器,也带有自己的 Web 服务器。 Zope 采用 Python 语言编写,在性能敏感的部件上采用了 C 语言编写。

不像其他基于文件的 Web 模板系统,例如 ASP 或者 PHP,Zope 是高度面向对象的Web 开发平台。

它提供了清晰的数据/逻辑/表示的分离,带有可扩展的内置对象和强大的集成安全模块。

Zope 架构让开发人员撇开了开发中的细节问题,诸如数据一致性,存取控制等。

Zope 提供了所有必须的工具,能集成来自任何数据源的所有的数据和内容,构成一个连续,可维护的 Web 应用,主要包括:

  • Web方式的管理界面
  • 集成的存取控制
  • 内容管理
  • 企业数据存取
  • 内置搜索工具
  • 强大的数据共享
  • 安全委托

Zope 和其他应用服务器不同之处在于,它从头开始就是不仅和Web 对象模型紧密结合,而且和Web 开发模型也紧密结合。

当今成功的 Web 开发要求很多方面的专家合作开发。

Zope 做到了这些,能让网站管理员安全的授权给数据库专家,内容管理员以及设计专家

1.2. Web 应用平台

让 Zope成为产品的技术就是基于 Web 从根本上来说是面向对象的。 Zope 中的对象是层次型的,就像我们熟悉的一些概念一样,例如文件夹,文档,图象,SQL 查询语句。

在Zope 的层次环境里,URL根据名字映射为其中的对象。 例如URL:"/Marketing/index.html",映射为文件夹对象"Marketing" 下面名为“index.html”的文档对象。

Zope 对象的建立和管理十分方便,只要打开浏览器,进入管理界面,所有管理和应用开发界面都可以通过浏览器来完成,界面就像 Windows 的资源管理器。通过这个界面,开发人员不必存取服务器上的文件系统就可以创建Zope 对象或者定义新的对象类型。

对象可以放到对象层次的任意地方。网站管理员可以点击目录栏得到对象的不同“视图”,这些视图视对象类型不同而不同,对于 DTML 文档,可以有 “Edit”用来编辑文档源码,而数据库连接对象则让你修改连接字符串或者缓冲参数。所有的对象都有“安全”视图以控制存取权限。

Zope 对象存放在高性能的事务型对象数据库中,可以采用文件系统或者关系数据库作后台存储。每一个Web 请求作为对象数据库中分离的事务,如果应用中发生错误,请求事务就会自动回滚。同时,对象数据库还提供多级回退。网站管理员可以点击鼠标取消曾经做过的操作。Zope 框架让所有细节和事务对应用开发人员都透明。

1.3. 内容管理

Zope 的心脏就是 DTML (文档模板标记语言),这个功能强大的变量插入和表达语言,提供对 Zope 对象的安全脚本和动态内容产生。 (注:Zope 2.5.0 以后,升级为ZPT-Zope Page Templet,使用更加高效的TAL-Templet Attribute Language ,更加明晰的分离了内容与形式!)

DTML 采用了服务器端包含脚本的语法,对很多 Web 开发人员来说很容易上手,而且和Zope 的安全模型高度集成。对安全的集成,可以让用户使用自己的 DTML 而不会对整个网站的安全构成威胁。

DTML 基本的变量插入和条件测试语句是十分直观的。DTML 代码采用 Zope 系统中对象的属性和方法,也可使用 Web 请求和表单中的变量。下面是一个文档标题属性显示的例子,当不同的用户登录时,显示不同的信息:

-------------------------------------------------------------------------------- 
本文档的标题为:<!--#var document_title--> 。
<p>
<!--#if "AUTHENTICATED_USER=='小地主'"-->
嘿!你好,小地主!
<!--#else-->
嘿!你好,陌生人!
<!--#/if-->
--------------------------------------------------------------------------------

当然 DTML 文档能包含其他 DTML 文档。一个常用的设计就是页面头和脚的包含:

-------------------------------------------------------------------------------- 

<!--#var standard_html_header-->

<h2>欢迎来到 www.FreeLAMP.com!</h2>

<!--#var standard_html_footer-->
--------------------------------------------------------------------------------

DTML 采用 #in 标记提供强大的递归插入。这个标记也可以用来自动管理批处理。下面的例子调用 SQL 查询对象,递归调用结果集数据建立表格:

-------------------------------------------------------------------------------- 
<table>
<!--#in getEmployees-->
<tr>
<td><!--#var first_name--></td>
<td><!--#var last_name--></td>
<td><!--#var job_title--></td>
<td><!--#var hire_date--></td>
</tr> 
<!--#/in-->
</table>
--------------------------------------------------------------------------------

采用这些标记和其他更加高级的 DTML 结构,Web 开发人员能调用 SQL 查询语句,建立新的对象,操作对象属性,建立高度动态的网站内容。下面的例子采用了 DTML的 sendmail 标记来发送 Email。

-------------------------------------------------------------------------------- 
<!--#var standard_html_header-->

<!--#sendmail smtphost="mail.freelamp.com">
To: Feedback Department <[email protected]>
From: Feedback Form <[email protected]>
Subject: 用户意见反馈

<!--#var name--> 提出意见:

<!--#var comments-->

<!--#/sendmail-->

<h2>谢谢!</h2>
<p>
感谢您的建议!
</p>

<!--#var standard_html_footer-->
--------------------------------------------------------------------------------

“安全脚本”的重要概念就是不像其他模板系统, DTML 不允许你建立任意的脚本对而构成对系统安全的威胁。相反,Zope 提供了一种不同的对象叫作外置方法,封装更加复杂的脚本和包含随意的代码。 DTML 的作者能调用外置方法,但是只能在自己的安全设定范围内运行。

大多数情况下, DTML 本身就能完成大多数一般性的任务,Zope 提供高级标记的目的就是为了减少编写复杂脚本的需要。“tree” 标记就是这样的例子,这个标记能提供和Zope 管理界面左边的帧一样的界面。

1.4. 数据存取

Zope 的数据源可以包括关系数据库,以及非关系型的 LDAP/IMAP 等。 Zope 支持常见的关系型数据库,包括Oracle, Sybase, MySQL 以及大多数 ODBC 兼容的数据库。

为了存取后台数据,你需要建立一个数据库连接对象,然后建立 SQL 方法对象, 这个对象能使用 DTML ,能很方便的建立动态的查询语句。下面建立的 getTasks 对象是从"tasks"表中选出对应用户的任务:

-------------------------------------------------------------------------------- 
select * from tasks
where
emp_id='<!--#var AUTHENTICATED_USER-->'
--------------------------------------------------------------------------------

结果集的数据应用于 DTML 文档:

-------------------------------------------------------------------------------- 
<h2><!--#var AUTHENTICATED_USER--> 的任务</h2>
<table>
<!--#in getTasks-->
<tr>
<td><!--#var title--></td>
<td><!--#var due_date--></td>
</tr>
<!--#/in-->
</table>
--------------------------------------------------------------------------------

Zope 以对象为中心的设计,允许你采用清晰的数据/表示分隔

数据库程序员在 SQL 方法对象上工作,内容设计人员调用这些 SQL 方法。

这样的对象模型也能容易的集成多种数据源,高级的数据存取特色甚至能定义数据库结果的对象行为,从而把平面型的关系记录转换为 Zope 应用的“智能”数据。

Zope 开发环境的另外一个好处就是它的事务模型能自动延伸到后台数据库,如果你的关系型数据库支持事务,Zope 会在运行SQL 方法之前自动开始事务,而在 Web 请求成功结束后自动提交事务,如果其中发生错误则会自动回滚,使事务的集成对Web 开发人员完全透明。

1.5. 集成的搜索

Zope 提供快速,灵活的索引,采用 ZCatalog 对象搜索。ZCatalog 对Zope 网站下所有类型的对象提供可高度定制的全文和域的索引。对象可以根据其内容或者属性索引,能提供结构化的搜索。

搜索结果可以来自多种不同的数据源,除了基本的文档外,还可能来自邮件列表的EEmail 消息对象,数据库里的记录,甚至 LDAP 目录中的资源。

1.6. 数据共享

Zope 的强大功能之一就是它简单而成熟的数据共享模型,这个模型叫做“获取”,核心的概念可以简单的描述为:

Zope 对象包含于其它对象中(例如,文件夹)

对象能够“获取”容器中的属性,内容,行为。

以前,我们决定把我们网站的头和脚封装到分离的 DTML 文档,这样能包含其他网站的内容,但是这个设计在拷贝头和脚到网站内所有的文件夹时发生了问题。如果我们采取“获取”的办法,在网站的顶层文件夹建立头和脚,下层的 DTML 就能自动“获取”。

这个概念对所有的对象都适用,对把常用的资源集中起来十分有用。例如,对一个经常用到的 SQL 查询语句,我们可以把它定义在一个文件夹里,子文件夹里的对象能自动通过“获取”来使用它,如果要改变查询语句,只需要改动一个地方就可以了。

因为对象从当前层开始“获取”,然后向上搜索,因此很容易建立自己的文档。 例如,我们有一个叫做“Sports”的文件夹,内容全部是关于运动的,你可以在这个文件夹里建立自己的头和脚,当前目录及其子目录下面的文档就会使用这两个文档而不是采用顶层的那个了。

对“获取”的使用方法可以写好几篇这样的文章,我们首先需要了解的就是它提供了一个简单但是强大的方法来避免数据冗余而增加网站的维护成本。

1.7. 安全授权

一个成功的网站需要组织起一个团队来合作:应用开发人员,SQL 专家,内容管理员以及应用的最终用户。在传统的网站里,维护和安全会很快出现矛盾。对权限的分配会变得十分复杂。

Zope 在这个问题上采用了数据和表示的清晰分离以及灵活的安全模型。采用“用户文件夹”来管理用户,里面包含用户信息。Zope 提供了要比普通文件系统要丰富得多的权限。

除了使用Web 来管理强大的封装和安全特色以外,Zope 还提供其他协议的合作开发特色,包括 FTP, WebDAV 和 XML-RPC。版本管理,能让其他用户看到最新的版本更新,但不是发布出去,如果版本的修改结束后,用户就可以“提交”版本,把最新版本的网站发布出去。

1.8. XML 支持

当前应用服务器市场的热门话题就是 XML 支持。Zope 除了内置的对基于 XML的协议 WebDAV 和 XML-RPC的支持外,Zope 的开发人员还可以利用一个快速的基于 C 的 XML 分析器,Zope 对象数据库能导出为 XML 格式。利用一个“XML 文档”的附加原型,可以把 XML 文档上传到 Zope,Zope 会自动分析文档及其元素,并储存为单独的 Zope 对象。

和 XML 相关的是,Zope 包含了对DOM(Document Object Model) API的支持。开发人员可以在 DTML 或者 Python 代码中使用熟悉的 DOM 调用来操作 Zope 对象。将来对 XML 的支持还会包含 XSL 处理以及用 XQL(XML Query Language) 对 Zope 对象搜索。

1.9. 结束的话

Zope 是高度可扩充的,高级用户可以建立自己的对象类型,或者采用 Python 写新的 Zope 附加模块。Zope 社区已经有很多这类的附加产品。更多的产品信息可以参考 Zope 的网站:www.zope.org

国内的 www.FreeLAMP.com 网站

是一家采用 Zope + SquishDot 架构的开放源码新闻网站,

着力于网站安全和 LAMP(Linux + Apache + MySQL + PHP/Perl/Python) 的架构。