从文件到对象 - Zope编程 - 李迎辉

(这条文章已经被阅读了 10 次) 时间:2001-11-30 16:34:27 来源:李迎辉 (limodou) 原创-IT

学习Zope有一段时间了。原来认为Zope离我太远,因为我想我不太需要做web开发,因为我已经会使用PHP了,用它也挺好的。Zope只能做web开发,似乎有些局限,不如多搞些常用的应用。不过看到好多人对Zope有兴趣,那么我也学一学吧。主要的资料就是《The Zope Book》一书。这真是一本值得一读的好书,让我看到就有一种想翻译出来的冲动(虽然我的英文只是一般般)。在学了一些基本的知识,如DTML Document,DTML Method之后,我特别想知道的是,如何在Zope中保存数据呢?于是我到Zope的安装目录下去找,什么都没找到。它放在哪里了呢?如果我想使用文件怎么办,能象一般的Python编程一样,生成一个文件,打开一个文件并对其进行处理吗?因为我学过PHP,我知道所有这一切都是与一般的编程一样,你可以象写一般的应用程序一样来写CGI程序,有所不同的的,它的输出要符合CGI的要求。不过,在PHP中编程的思想是简单的,而且你也有一种全盘控制的感觉。只不过是工具有些太基本,就象C一样,的确可以做许多的事情,但许多事情都要重新来做,不过做了什么自已非常清楚。可是Zope呢?虽然我可以做简单的页面输出,但我最想知道:数据,到底是什么保存的;还有就是:什么东西是已经提供好了的可以直接使用。其实这是一个很基本的要求,因为大部的web程序都是要处理各种信息,并对其进行保存和处理的。我想如果明白了这些,可能会感到Zope容易上手一些吧。

在Zope中,你不可以直接使用文件处理,Zope对于模块的处理是有限制的,如果你想突破这种限制,那你不能只在web浏览器中做这件事,你需要在文件系统中编程。如果我只想使用浏览器完成编程,是如何实现的呢?那么,实现的关键是Zope是一个对象系统,而不是简单的文件系统。也就是说,在Zope中你看到的都是一个个的对象,而不是一个个的文件。因此,这种结构虽然如同文件系统,有对象,有文件夹,文件夹里放着各种各样的对象。你可以在Zope中象Window的资源管理器一样浏览文件夹和对象。你可以把Zope看成一棵对象树。但它不是真正的文件系统,它有着比文件系统更丰富的内容。因此如果想向Zope中添加内容时,你必须使用Zope提供的各种各样的API来加入各种对象。

对于我来说,我已经熟悉了文件系统的处理,而且这种处理对不同的操作系统,不同的语言基本上都是一样的。如打开一个文件,我会使用open。它可以带模式参数,如”r”,”w”,分别表示读打开与写打开。这些东西我想大家也应该很熟悉了。那么为什么转到Zope会给人一种非常陌生的感觉,或者说从通常的文件编程转到Zope编程,到底有哪些应该知道的呢?关于这一点,没太注意哪里有说明(也许是我东西看的不够)。那么我只想把我的一些体会说给大家听一听。

抛弃

Zope对于我来说,真是一个全新的东西。它是一个对象系统,不仅仅体现在你加入到Zope中的东西是对象,而且可以扩展到整个Zope是一个最大的对象。因此,对于这个全新的东西,我们应该将以前所熟悉的文件系统编程的一些经验抛弃掉。Zope有自已的概念,术语,API,控制,而且更复杂(比起文件系统来说是复杂多了,但如果了解了几个基本点可能就好理解一些)。这样,以前的一些规则可能就不太适用。比如,我们创建一个文件,一般我们只要在open函数中给出文件的路径就可以了。但在Zope中,它不是真正的文件系统,怎么做。因为Zope是对象,因此我们要使用Zope提供的API,用它们来创建我们所需要的对象。如创建一个DTML Document对象时,我们先要知道它的容器(container,可以用来放置对象的对象,如一个Folder)是谁,然后通过容器来调用对象的构造函数,这样就可以在一个容器中生成一个新对象了。在文件系统编程,文件夹与文件的关系显示得比较弱,但在Zope中,要比较注意,这种关系应该要清楚。如果想对对象进行操作,则应该使用对象所提供的方法进行处理。在Zope中要使用容器来生成新的对象。知道了这一点,那么对对象的内容进行操作,则也是应该通过调用对象的方法。Zope中提供了每个对象的API,你可以进行查询,找到自已需要的东西。那么,当我们要保存数据时,我们可以向一个文件夹中增加一个DTML Document对象,用它来保存数据。

隐含

隐含什么了?Zope隐含了许多东西,如果你不清楚,可能就不明白为什么是这样的。

名字空间

名字空间提供了变量,方法的作用范围。在Zope中,它不是一个,而可能是多个,根据作用的范围,它提供了一个名字空间的栈。文件系统可没有什么名字空间。名字空间与编程有关,更与对象有关。对象在Zope中都是在一定的名字空间里起作用。在看到一个DTML Document时,你看到<dtml-var title_or_id>,你知道是什么意思吗?title_or_id表示,如果有标题,就返回当前对象的标题,如果没有则返回id。如果DTML Document的标题是”Hello”,id是”hello.html”。那么结果就是”hello”。但如果是一个DTML Method对象结果会是怎样的呢?它会返回容器的标题或id。为什么会不一样呢?Zope在处理对象时,对于DTML Document对象,它会把这个对象推入栈中。而对于DTML Method对象,则不会这么做。而且重要的一点,在栈顶的对象没有明确指出来,这样只能通过上下文进行理解。这样Zope提供了一个上下文对象(在Zope中叫Client Object)。因此会有这样的不同。当然,通过上下文来理解当前对象的一个好处是,对于DTML Method和Script这样的对象,可以看成栈顶对象的方法。这样,这些处理方法就具有通用性了。你可以把一个通用的处理作用于任何一个想要处理的对象,而且使用时仿佛就是对象自身的方法一样。这是它的一个方便之处。对于DTML Document当前对象就是自身。对于DTML Method当前对象是名字空间最项层对象。对于Script当前对象是context对象

为什么会形成名字空间栈,那么它里面有些什么呢?(本人对此研究不深,只能说一说)当一个web请求发到Zope上来,Zope首先形成一个REQUEST对象,它里面包含有Form变量,Cookie变量,CGI环境变量等。然后它会根据访问的URL,一层层地查找相应的对象。查找的根据是按’/’进行分隔。因此这是一种通过URL来表现Zope对象或方法的一种方法。在Zope中叫对象的公布(publish)。每找到一个则将其放入栈中,这样就形成了一个对象栈,也就是名字空间。里面其实就是一个个的对象。这种组织的确使Zope变得复杂,但同时给编程带来一些便利。这在后面“获取”中会谈到。对于这种名字空间,你可以进行修改。如使用<dtml-with>可以将某个栈提到最前面。在DTML Document或DTML Method我们可能看到一些方法没有给出它属于哪个对象,这时要根据名字空间去理解,最项上那个就是。除非你通过别的方式修改了名字空间。

获取(acquisition)

获取是Zope特有的术语,一定要好好理解。前面已经讲到了名字空间,我们知道根据对象出现的顺序,名字空间自下向上排列,最后访问的对象在最上面。当Zope分析到某一层时,它首先会在项层的对象中查找,如果没找到,则使用获取功能。如何做的呢?先从项层对象所在容器中进行查找,如果没找到,则从容器的上级容器中进行查找。那么可以理解获取就是沿对象树往上查找指定对象直至最项层。如果从栈来理解,则是往下查找,直到最下面。

遍历(traversal)

遍历是查找最终公布对象的过程。那么我们可以理解遍历是沿对象树向下查找对象的过程。Zope根据URL,一层层分解,从最上面的对象找起,找到后,再分析下一层,再找下一个对象。当没找到怎么办,使用获取。这样Zope就交替使用这两种方法最终找到需要处理的对象。

这两种方法在你直接使用web编程是隐含的,即是自动完成的。因此,在你的DTML Document,DTML Method或Script中,也是可以这样使用的。因此,如果你发现在当前的文件夹中找不到一个对象,那么就想一想获取和遍历吧

结构

什么是Zope的结构,说白了就是文件夹与对象的结构,也就是你那棵对象树是如何组织的。为什么它很重要呢?就是因为Zope是一个对象系统。对象是有继承性的,文件夹也是对象,这样子文件夹就可以继承父文件夹的内容。因此如果在父文件夹中生成了一个对象,通过acquisition可以得到它。这样,在子文件夹中不用再重新生成了。这一点非常重要。关于这一点,应用最多的可能就是页头和页脚了。当我们做一个网站时,我们希望有统一的风格,因此我们可能希望页头与页脚应该是统一的,可能根据所在的位置而稍有不同。好,在Zope中非常简单。如在根文件夹中生成一个html_head和html_footer,这样在任何想风格一致的对象中我们使用它们就可以了。其中html_head可以使用另外一些对象,这些对象可以在每个文件夹都有,它们根据文件夹的不同而不同。这样风格即统一,而又有所区别。这一点与别的语言的引用用法(如PHP中有include,require函数)有很大的差别。因为其它语言处理的是文件,不是对象,因此路径一般都是固定的,如果想不固定,那么你就要花些功夫来实现了。而Zope是对象系统,可以很自然的通过acquisition来得到上层文件夹的东西,使用起来即自然又方便。

那么我们如何去组织结构呢?按对象的方式去组织。最基本,最通用的东西放在上层文件夹中,特殊的东西放在子文件夹中。

对象的公布

好了,我们可能已经比较容易地理解如何管理,生成对象了。那么对象怎么被我们使用呢?这里就是怎么通过浏览器去看我们做的东西呢?这就要通过前面我们已经提及的对象的公布了。Zope有专门的类来对对象进行公布。首先,都会公布对象的哪些东西呢?Zope中的许多对象都是可以通过浏览器来查看的,如文件夹,DTML Document,DTML Method,Script,File,Image等等。而且这些对象的方法在经过处理后也可以被公布。其实我们在浏览器中进行Zope编程时很多都是用的对象的方法。其次,怎么公布呢?要根据你的结构来编写一个正确的URL,这样Zope在得到这个URL后,会根据’/’进行拆分,同时将其视为对象在,并按顺序进行查找,直到找到最终的对象,或是对象的方法。然后进行调用并输出结果。

小结

到了这里,也许你已经对Zope的对象系统有所了解,可能在进行Zope编程时会容易一些。当然,我所讲的还都是我个人的理解,并不能代表Zope的全部精华。其实更精华的地方还在于Zope的产品(product),其实Zope的安全我也认为是一大特色。那么你是不是已经从传统的文件编程多少已经转变了一些观念呢?当然有些题目还可以继续展开,我们以后可以再谈。

版权所有 limodou([email protected]),如要转载请保留此信息。