使用Zope的基本对象
- "英文"
- using basic zope object
- 翻译来源
- zope.slat.org
- 翻译作者
- 由張文宏認領,翻譯完成
- 状态
- 直接转换为简体,未做其他改动
第三章:运用基本Zope物件
当你用Zope建立网路应用程式,你是用物件来建立的。在设计时,不同的物件负责你应用程式的不同部份。有些物件存放你的内容,比如文件、试算表和图片;有些物件负责应用程式的逻辑,比如从网页上的表单接受资料或执行命令稿;有些物件控制内容如何呈现给别人看,比如以网页的形式或以e-mail的形式。一般来说Zope的物件扮演了三种角色:
内容
像文件、图片、档案等Zope中的物件可以存放不同的文字或二进位资料。除此之外,Zope可以存取放在Zope外部的资料,如关联资料库。
逻辑
Zope有一套方法处理程式逻辑。Zope可让你用Python,Perl和SQL写命令稿。程式逻辑是种不包含呈现方式的程式设计,而是做一些工作像改变物件、传送讯息、条件测试和对事件做回应等。
呈现
使用Zope中网页样板的物件让你可以控制网站的外观感觉。Zope使用一种以标签为基础的命令稿语语来控制呈现方式,这种语言叫做DTML.
物件是被用得很凶的词。根据背景的不同,它对你可能表示不同的东西。在这一章里,可以把Zope物件想成是应用程式的元件,你可以透过浏览器来控制或编辑它。
Zope有许多内建物件来帮你做不同的事。你也可以安装协力厂商的Zope物件来增加Zope的功能。这一章解释大部份的基本物件和它们运做的方式。只运用本章所介绍的物件就可以让你建立一个有完整功能的Zope网站。
本章大体是围绕在内容、逻辑和呈现这三类物件上。其它不能明确归在这三类的物件,会在本章最后来做说明。
运用Zope资料夹(Folder)
资料夹是用来建立Zope的区域。资料夹的目的是用来装其他的物件,并把物件分门别类。
资料夹可以装所以种类的物件,包括资料夹,所以你可以把资料夹放入资料夹内,变成一个树状的资料夹。这种安排方式让你的Zope网站有结构。好的结构是非常重要的,几乎Zope的各方面都会被你网站的结构所影响(从安全性到呈现方式)。
不管你电脑上用的是微软档案总管或UNIX上xfm、kfm、Gnome档案总管,资料夹结构应该跟你用档案总管看到的非常相似。Zope试着让管理介面看起来就像你所熟悉的程式,让组织Zope物件就像是你在电脑上用档案总案组织档案一样。
管理资料夹(Folder)内容
在第二章,你曾建立物件并移动它们。总地来说,你从资料夹的Contents标签里的下拉式选单中选择所要的物件,填好表单并送出。然后新的物件就被加到目前的资料夹中。你可以用剪下、复制、贴上、删除和重新命名的按钮在资料夹之间移动物件。
汇入及汇出物件
使用汇入及汇出能让你把物件从一个Zope系统移到另一个。你可以把所有类型的Zope物件汇出成一个汇出档。然后这个档可以被汇入到任何一个Zope系统。
你可以把汇出物件想成是把你Zope系统的一部份复制到一个档案,并从一部机器移到另一部。你可以把这个档移殖到其他的Zope伺服器。想像你在Zope资料夹内有一些文件。假如你想把那些物件拷贝到你朋友的Zope系统,你可以汇出资料夹,把汇出档用e-mail送给朋友,然后你的朋友就可以把它汇入。
假设你在学校的Zope伺服器有个家庭作业的资料夹,你想把它汇出好让你可以在家里的Zope伺服器上处理它。你可以在你的根资料夹内建立一个叫做"homeWork"的资料夹。到包含你的homeWork的资料夹内。点homeWork旁的点选盒就可以选取它。然后点汇入/汇出的按钮。你现在应该在汇入/汇出标签里,就像Figure3-1
这个画面有两个区段。上半部是汇出,下半部是汇入。想要从这个画面汇出一个物件,把这个物件的id填入第一个表单栏位,然后按汇出钮。在我们的例子中, Zope已经在栏位填了资料,因为我们在上一个画面已选了homeWork资料夹。
下一个选项让你选择你的汇出档是要下载下来或是留在伺服器上。假如你选了"下载",然后按了汇出键,你的浏览器会提示要你下载档案。假如你选"留在伺服器",Zope会把这个档存在它在执行的同一部机器上,而你必须自己从那个位置取得档案。这个汇出档会被写在伺服器上Zope的var目录里。汇出档预设会有zexp的档案类型。
一般来说,把汇出档下载下来会比较方便。有时候把档案存在伺服器上反而会更方便,比方说你的连线速度慢而档案又很大,或者是你只是想把物件汇出到同一台机器的另一个Zope上。
汇出选单的最后有一个"XML格式"点选盒。选了在汇出档案时会变成XML的格式。以XML格式下载下来的档会比较大,但比较有可读性并可被XML解析。现在唯一了解这懂XML格式的是Zope本身,但在未来也许会有其他的工具能了解Zope的XML格式。一般来说,你应该不管这个选项除非你很好奇这种XML格式长得什么德性,而且想要直接检视它。
按"汇出"钮并把你的homeWork.zexp档存起来。
现在假设你已回到家,而且想要把档案汇入到你家里的Zope伺服器。首先,你必须把汇出档拷贝到你伺服器上Zope的import目录。现在,到你想汇入的位置的"Import/Export"标签,在表单的"Import file name"的地方输入档名,然后按"Import"把物件汇入到Zope上。
Zope有一些选项像是取得汇入物件的拥有权或保留原有的拥有权。在第六章会讨论拥有权。让取得汇入物件的拥有权被选取就可以了。
在你汇入后,你在做汇入动作的资料夹内就会有一个新的Zope物件。
想要把你的作业带回学校,只要做同样的汇出汇入动作就可以了。注意到如果你不能在同一个资料夹内汇入两个相同id的物件,所以你需要把它汇入到一个没有homeWork在里面的资料夹。然后你需要把旧的homeWork资料夹删除,接着把刚汇入进来的资料夹拷贝到这个地方。
运用Zope document
文件里有文字。在网站应用程式中,你通常使用文件来产生网页。你也可以在文件中放一些文字档,或是片断的HTML码像导览列或标头。除了放文字,文件也可以直接让你从网页上直接编辑文字。Zope有几种不同类型的文件。其中最重要的是DTML文件,DTML的意思是文件样板标记语言。
有其他协力厂商的物件(一般称为Products产品)可以从像Zope.org取得,这些可以增强功能,支援别种文字性或非文字性的内容。
DTML文件(document)
使用DTML文件来建立网页及可被共用的片断网页如导览列。DTML文件可以有DTML中的命令(Zope的标签命令稿语言)。混合使用HTML及 DTML可以产生动态物网。
DTML文件对建立共用内容有也帮助,比如文件结构。
建立DTML文件(document)
在根资料夹内建立一个叫做Sales的资料夹。然后按一下Sales资料夹并从第二章提到的加入选单中选择DTML文件。这些动作会带你到DTML文件的新增表单。让id叫做SalesStaff,title叫做"the Jungle Sales Staff",并按下新增。你已成功建立一个DTML文件。然而它的内容只有一些标准的一些字,所以接着下一步来编辑内容。
编辑DTML文件(document)
最简易也最快速的编辑方式是透过管理介面。找一个文件,在它的名字或图示上按一下就会带到如Figure3-2的表单。
这个标签里有一个文字区块让你可以编辑文件的内容。假如你按下变更钮就会让你所做的改变生效。你可以用变高、变短、变宽跟变窄按钮来控制文字区块的大小。你也可以用上传档案按钮上传一个新的档到文件里。
把现在SalesStaff的DTML文件里预设内容删除。
在SalesStaff文件加入以下的HTML内容:
\<html\>
\<body\>
<h2>Jungle Sales Staff</h2>
<ul>
<li>Tarzan</li>
<li>Cheetah</li>
<li>Jane</li>
</ul>
\<\/body\>
\<\/html\>
当你做完后,按一下变更钮。Zope的讯息告诉你变更已生效。现在你可以按View标签来看文件。
恭喜你!你已经用Zope建立了一个HTML网页。你可以一次就做好建立及编辑,只要你在新增的地方按下"新增及编辑"。
你可以在线上编辑HTML然后马上看结果。事实上,你可以用HTML文件跟资料夹建立整个Zope网站。虽然这个动作只展示了一些Zope的好处,但它提供你一个熟悉的介面来使用Zope。你也可以在Zope上写一些动态内容,或让喜欢纯粹设计HTML来写网页的人用这个方法。
上传HTML档案
假如你不喜欢在浏览器上编写HTML,或你已有一些网页想放在Zope上。Zope允许你上传已有的文字档变成DTML文件。
从新增选单选择"新增DTML文件",画面会带到DTML文件的新增表单。表单的最后有一个浏览的按钮。按下这个钮。你的浏览器会带出一个选择档案的对话框。从你的电脑中选择你想上传的文字档。
把新文件输入一个Id后按下新增。之后画面会到管理画面,在那你可以看到你的新文件。
用FTP、WebDAV、PUT做远端编辑
虽然Zope让你直接在浏览器上编辑文件,但这并不是唯一的方法。对简单的文件来说,直接在网页上网辑是比较方便的办法。但是对于比较大、比较复杂或有特殊格式的文件,用你习惯的编辑器来做会更有效率。
DTML文件可以用FTP、WebDAV、HTTP PUT等协定来编辑。许多HTML及文字编辑器支援这些协定,可以编辑远端伺服器上的文件。以上的协定每一个都有它的优点及缺点。
FTP
FTP是档案传输协定。FTP是用来把档案从一个机器传到另一个机器。许多文字编辑器支援它,所以它是很有用的。
WebDAV?
WebDAV?是一个建立在网路基本协定HTTP之上的新协定。DAV是分散式写作及改版的意思,因为DAV是新的协定,它被编辑器支援的程度可能不如FTP。
PUT
HTTP协定支援一种简单的方法把内容传到伺服器上,这叫做PUT,PUT被许多HTML编辑器支援,比如像Netscape Composer。
使用以上的其中一种方法,你能用不同的工具来编辑你的内容。在下一节,我们会展示一些简单工具,以FTP的方式来编辑Zope上的内容。
使用WS_FTP上传文件和档案
WS_FTP是Windows上一个受欢迎的FTP用户端程式,它可以让你用FTP协定把文件或档案上传到Zope上,WS_FTP可以从Ipswitch Home Page 下载。
还有别种在Windows上受欢迎的FTP用户端程式,而且许多浏览器像Nescape跟Mircosoft IE都有FTP用户端的功能。这一节的功能也适用于其他的FTP用户端程式。
在第二章,你从系统启始的讯息得知Zope的URL,以同似的方法来找出连接Zope FTP伺服器的方法::
------
2000-08-07T23:00:53 INFO(0) ZServer<a class="new" href="http://members.czug.org/zope/zopebook/X_e4_bd_bf_e7_94_a8Zope_e7_9a_84_e5_9f_ba_e6_9c_ac_e5_af_b9_e8_b1_a1/createform?page=ZServer" title="create this page">?</a> Medusa (V1.18) started at Mon Aug 7
16:00:53 2000
Hostname: peanut
Port:8080
------
2000-08-07T23:00:53 INFO(0) ZServer<a class="new" href="http://members.czug.org/zope/zopebook/X_e4_bd_bf_e7_94_a8Zope_e7_9a_84_e5_9f_ba_e6_9c_ac_e5_af_b9_e8_b1_a1/createform?page=ZServer" title="create this page">?</a> FTP server started at Mon Aug 7
16:00:53 2000
Authorizer:None
Hostname: peanut
Port: 8021
------
2000-08-07T23:00:53 INFO(0) ZServer<a class="new" href="http://members.czug.org/zope/zopebook/X_e4_bd_bf_e7_94_a8Zope_e7_9a_84_e5_9f_ba_e6_9c_ac_e5_af_b9_e8_b1_a1/createform?page=ZServer" title="create this page">?</a> Monitor Server (V1.9) started on port
8099
启动讯息告诉你Zope FTP伺服器在叫做peanut的机器上聆听port 8021。当你启动WS_FTP,需要知道主机名称及port的资料才能透过FTP连上Zope。在输入完Zope伺服器的主机名称及port后,按下Connect钮,WS_FTP会询问你帐号及密码。输入你在Zope上管理介面的帐号及密码。
假如你直接输入帐号及密码,WS_FTP用FTP秀出Zope网站的样子。有资料夹跟文件,分别对应到你用网页看到的Zope根资料夹,像Figure 3-3。
用WS_FTP把档案上传到Zope或下载下来是非常容易的一个事。WS_FTP视窗的左半部是档案选取盒,代表你自己的电脑。右半部的视窗代表Zope系统中的物件。从你的电脑传档案到Zope很容易,只要选择你要传的档案,然后按下左箭头(下载)或右箭头(上传)即可。WS_FTP有许多很酷的特色跟自订功能让远端管理Zope物件变得非常简单。
使用Emacs编辑Zope物件
Emacs是很受欢迎的文字编辑器。事实上,Emacs不只是个文字编辑器,它是一整个文化。Emacs有两种口味,GNU Emacs跟Xemacs。两种都能直接以FTP处理Zope文件及文字内容。
Emacs让把远端FTP系统当成当地的档案系统,这让管理Zope内容变得很简单。所以你不需要为了Zope而放弃Emacs。
Emacs比大部分浏览器的文字区块提供了更丰富的文字编辑功能。透过FTP,Emacs可以直接编辑及处理物件,所以Emacs是很好的Zope发展环境。
一般预设当你启动Zope时,Zope会执行FTP及HTTP伺服器。你能指定启动时FTP伺服器的port,预设是8021。
要登入Zope,先执行Emacs。根据你用的是XEmacs或Emacs,开启FTP连接的方式也不同:
Xemacs
在Xemacs中要看一个远端的档案,用下列型式::
/user@server#port:/
这会开启一个FTP连线,在叫做server的机器上的埠号是port的/资料夹。
Emacs
在Emacs中要看一个远端的档案,用下列型式::
/user@server port:/
文字中的空格是用Ctrl跟Q跟空白键按出来的,"C-Q "。
对一般方式的Zope安装,要用来跟Zope建立FTP连接的档名是/user@localhost#8021:/。
Emacs会问你登入Zope FTP伺服器的密码。
看Zope FTP伺服器的/资料夹,Emacs会把根资料夹的内容列出来::
drwxrwx--- 1 Zope Zope 0 Dec 30 1998 Control_Panel
drwxrwx--- 1 Zope Zope 0 Dec 30 1998 QuickStart<a class="new" href="http://members.czug.org/zope/zopebook/X_e4_bd_bf_e7_94_a8Zope_e7_9a_84_e5_9f_ba_e6_9c_ac_e5_af_b9_e8_b1_a1/createform?page=QuickStart" title="create this page">?</a>
drwxrwx--- 1 Zope Zope 0 Dec 30 1998 Sales
-rw-rw---- 1 Zope Zope 1024 May 3 1999 index_html
-rw-rw---- 1 Zope Zope 1381 May 3 1999 standard_error_message
-rw-rw---- 1 Zope Zope 55 Dec 30 1998 standard_html_footer
-rw-rw---- 1 Zope Zope 81 Dec 30 1998 standard_html_header
你可以用Emacs中的方法选择任何一个"档"来看它的内容(这些档是货真价实的Zope物件)。用Emacs来编辑是很有用的,但是,Emacs是非常复杂的程式,一般人不容易使用它。还有许多简易的编辑器可以用FTP跟WebDAV的方式。事实上,WebDAV是设计给像Adobe GoLive?跟Macromedia Dreamweaver来使用的。
以WebDAV方式编辑DTML文件
比起HTTP或FTP,WebDAV是个新的网际网路协定,所以支援的用户端程式较少。然而,有许多的动力在推动WebDAV,会有更多的用户端程式被发展出来。要知道更多支援WebDAV程式的资讯,请到 the WebDAV? homepage。
WebDAV?是HTTP的延伸,它提供了很多特征让许多使用者同时在网站上写作编辑。WebDAV提供了一些像是锁定,改版控制以及标记文件、有属性的物件的功能。因为WebDAV的目的是在网上做编辑,这符合Zope的一些目标,所以Zope早已支援WebDAV协定。
WebDAV?协定发展得很快,新功能一直被加进来。用任何的WebDAV用户端程式都可以编辑你的DTML文件,只要在程式里指定文件的URL就可以了。但是对某些程式而言,这样做会编辑到文件处理后的结果,而不是原始资料。如果文件里有用到Zope的DTML样板语言的话,这样做会有问题。
在用户端程式还未赶上最新的WebDAV标准,并了解文件原始资料及处理结果的不同之前,Zope提供了一个特别的HTTP伺服器,你可以在命令列用-w选项来启动这个功能。这个伺服器对聆听一个非HTTP的port,而且对这个port的WebDAV要求会回应原始资料。这个进阶功能在Zope.org的文件区会有更多的解说。
回顾文件改版记录(history)
Undo标签让你一次可以还原一个交易机制,但通常只还原同一个物件的改变是比较有用的。还记得一个交易机制可以是一组同时发生的动作。假如在交易机制中包括了编辑文件及移动一个物件。你可以不是想要还原文件的改变,而不是还原搬移的动作。想要做到这样的要求,你可以到物件的History标签,观看物件的前几次状态,就像Figure 3-4。
甚至文件有比较不同版本的功能,让你可追踪文件的改变。例如,DTML METHOD与文件允许你选择两次改版来互相比较。你可用此功能来看别人对你的物件做了什么改变。比如说,你有一个文件包括了所以动物园里的动物名单。假如你的一个同事改了这个名单并储存,你可以用这个回顾功能比较最新版最之前有什么不同。
比较是用常用的diff形式呈现。diff告诉你文件增加了那些行(有个+),减少了那些行(有个-),那些行被取代或改变(有个!)。
检视DTML文件(document)
DTML文件的主要目的是存放有用的内容。而内容的主要用途是被检视。DTML文件可以有几种检视方式:
管理介面
你可以从管理介面按文件的检视标签来看文件的内容。
直接从网路呼叫
从浏览器里指定文件的URL就可以看到。
从其他物件呼叫
其他物件如DTML物件,可以显示文件的内容。
从网路呼叫
就像Zope其他的物件,DTML文件的URL是根据它的id。比如说,你在根资料夹有个DTML文件叫做Bob,它的URL会是::
<a href="http://localhost:8080/Bob">http://localhost:8080/Bob</a>
假如Bob是Uncles下的子资料夹,它的URL是::
<a href="http://localhost:8080/Uncles/Bob">http://localhost:8080/Uncles/Bob</a>
在Uncles资料夹下如果有Rick、Danny、Louis的DTML文件。你可以同时在网路上存取它们::
<a href="http://localhost:8080/Uncles/Rick">http://localhost:8080/Uncles/Rick</a>
<a href="http://localhost:8080/Uncles/Danny">http://localhost:8080/Uncles/Danny</a>
<a href="http://localhost:8080/Uncles/Louis">http://localhost:8080/Uncles/Louis</a>
把URL对应到物件不是一个新的想法,有的网页伺服器像Apache都是这样处理。它们把URL对应到档案系统上的档案跟目录。Zope把这个想法更上一层楼。在Zope中,URL看起来很容易,因为它们看起来就像Zope里物件组织的方式。这就是为什么我们之前告诉你,网站的结构是网站成功的关键。
指定DTML文件URL的方式就是直接从网路上呼叫。这会让DTML文件的内容被估算,然后传给你的浏览器。在下一章会告诉你什么是估算DTML文件,但是现在,你可以用DTML跟简单的HTML来做实验,以得到一些概念。
从其他物件呼叫
在使用Zope中,你可能已遇到一些DTML的例子,像::
<dtml-var standard_html_header>
<h1>This is some simple HTML</h1>
<dtml-var standard_html_footer>
在此,我们看到一个DTML物件,standard_htmlj_header在文件里被呼叫。在这个例子中,第一个估算的内容被插入到做呼叫动作的文件。这是Zope中很基本的概念,在整本书里会一直被用到。
运用Zope档案(file)
Zope档案包含原始资料,就像你电脑上的资料一样。许多资讯,像软体、声音、影像和文件,都以档案的方式在全球网际网路上被传递。你可以在档案里存放任何一种Zope不直接支援的资料,像Flash档,applet小程式,压缩档等。
档案不管它的内容是什么格式,文字或其他东西。档案是一个很好的方式来存放任何一种的电脑里的二元资料。
每个档案物件都有一个特定的content type ,这是标准网际网路MIME指定档案类型的方式。当你传一个档到Zope上,Zope会试着从档名来猜它的content type,但是Zope不会永远猜对。
上传档案
就像DTML文件跟DTML METHOD,档案充许你用上传档案表单传档来建立一个新的物件。按浏览钮后选一个档案传上去就可以让你建立一个新的Zope物件。试着选一个Word档(.doc)或pdf档。注意到当你用浏览器上传一个档,你可以在上传的画面里指定档案的content type。在选好后,按新增钮。你上传的档案越大,花的时间会越久。
在新增后,按一下新增的档案,并看它的Edit标签。你可以看到Zope猜了一个content type就像Figure 3-5
假如你新增一个Word文件,content type变成application/msword。假如你新增一个PDF档,content type会是application/pdf。假如Zope认不得你的档案类型,预设会选通用类型 application/octet-stream。
到Upload标签可以让你改变一个现有的档案。在此你可以用新档取代原来档案的内容。假如你在上传表单没有填上id 跟title,Zope会把档名当成这个物件的id跟title。
检视档案
在管理介面的View标签里你可以检视一个档案。你也可以URL方式来检视一个档案。事实上View标签是在管理介面里使用档案的URL方式来得到档案内容。例如,假设你在Zope的根资料夹有一个档案叫做employeeAgreement.pdf,你可以在浏览器指定http://localhost:8080/employeeAgreement.pdf来检视这个档。依你的档案类型,浏览器会显示它或要你下载它。
运用Zope image
image可显示像GIF、JPEG、PNG等图档。在Zope,images跟档案物件很类似,但也包括了额外的方法来管理图形内容。
image物件跟档案物件有着相同的管理介面。在前一节提到使用档案物件的方法也适用image。
用HTML检视image
在Zope中image最常用的是把图片放在网页中。你需要用HTML IMG标签把图片放进网页中。假如你在根资料夹中有一个叫logo的image物件,里面有你们团体的logo。
在你的HTML中用image是很直接的方法:你可以用IMG标签把许多种的image放到网页中。:
<dtml-var standard_html_header>
<img src="logo">
<h1>Welcome!</h1>
<dtml-var standard_html_footer>
在这个例子中,你用HTML IMG标签参考到logo 图片,但通常你不需要建立IMG标签来显示图片。image物件知道如何产生HTML标签。当你用DTML插入一个image物件,它会自已产生IMG标签。
现在,我们想要把这个logo放在每一页的左上角,所以在standard_html_header method里放入::
<html>
<body>
<dtml-var logo>
在你的根资料夹按View标签。假如你看Zope网页的原始档,你可以看到原来var的DTML变成IMG标签::
<html>
<body>
<img src="logo" width="50" height="30">
用DTML var标签来显示图片是很简单的,因为Zope自动帮你填好IMG的height跟width属性。假如你不喜欢Zope建立IMG的方式,你可以自订,参考附录B的资料以了解更多image物件的资料,以及它如何控制IMG标签。
在Zope.org网页上的visual区段有很多协力开发的Zope物件(一般叫做"Products")可用来储存及检视image的内容。
在网上检视image
在浏览器上指定URL就可以看Image。例如,你想直接看公司的logo,它是在你根资料夹的一个影像物件叫做logo,用URL http://localhost:8080/logo就可以很轻易地看到它。
既然Zope image用起来就跟什常的网页伺服器一样,你可以从别的网页伺服器来存取它。假如你有一个Zope image它的URL是http://imageserer:8080/Birds/Parakeet.jpg。你可以在别的网页伺服器的任何网页中使用它,只要在网页中使用image的绝对URL::
<html>
<h1>Remote Image</h1>
<img src="http://imageserver:8080/Birds/Parakeet.jpg">
</html>
这个例子告诉你在Zope之外,如何用标准的网际网路协定来使用Zope中的资料。稍后在本书第8章中,我们会看到大部份的Zope物件如何来给外部来使用。
运用物件属性
在Zope中,属性是用来把物件与资料关联起来的一种方法。许多Zope物件,包括资料夹和文件,都有属性。属性可用来标示物件以说明它的内容(许多Zope内容物件都有一个内容属性)。属性的另一个用途是为一个物件提供相关资料像是作者,标题,状态等。
属性可以比字串还要复杂;它们可以是数值,串列或其他资料结构。所有的属性可以经由属性标签来管理。按一下物件的属性标签,你会看到属性管理画面,就像Figure 3-6。
一个属性包括了名称,值跟类型。属性的类型定义它能有何种值。
在Figure 3-6中,你可看到资料夹有三个属性,title,Author,KeyWords。title跟Author属性是字串属性,而KeyWords属性类型是tokens。tokens是一连串的字。
Zope支援多种属性类型。每一种类型都有它的用处。下例清单是一个简介,告诉你从管理介面能建立何种属性。
string
string是任意长度的字元序列。string是Zope中最基本最有用的属性型态。
int
int属性是一个整数,它可以是任何正负整数,但不能是小数。一个int最少有32个位元长。
long
long像int,但没有范围限制。
float
float可存放浮点数或是小数。例如货币值通常使用float。
lines
lines属性是字串序列。
tokens
tokens是字串串列,以空白为间隔。
text
text属性就像string属性,除了Zope会把断行字元正规化(不同的浏览器使用不同的习惯用断行字元。
selection
selection属性很特别,它会被显示成一个HTML选取输入项。
multiple selection
multiple selection属性很特别,它会被显示成一个HTML多重选取输入项。
属性是个非常有用的工具,它可以把你的Zope物件加上一些资料。与method及script合并使用,属性可延伸简单的物件,如资料夹,把它变得很有威力。
运用Script来编写程式逻辑
在传统程式术语中,script是用程式语言写的片断程式码。在2.3版中,Zope支援两种script物件:一个是用python来写,一个用perl来写。
python跟perl都是非常受欢迎及很有威力的程式语言。python 跟perl有很多相似的特色:都提供很有威力的,快速发展,简单语法,许多额多的函式库,强力的社群及大量的免费线上文件。两种语言都是开放原始码。
因为script是如此的威力强大及富有弹性,它们的可能性是无穷的。script主要是用来写所谓程式逻辑的部份。程式逻辑跟呈现逻辑不同。呈现逻辑通常在呈现语言中编写,如DTML,它的主要目的是把资料呈现给使用者。程式逻辑通用在script语言来编写,它的目的是根据来源内容(如文件或资料库)来处理资料,或处理其他物件。通常呈现逻辑是建构在程式逻辑之上。
使用script的一个简单例子是建立一个线上网站来帮助使用者计算他们的复利。这种计算包括下面的步骤:
- 你需要以下的资料:你目前帐户的余额(或负债)叫做principal,年利率以小数来表示(如0.095)叫做interest_rate,每年复利计算的期数(通常是每月算)叫做periods,你想计算的年数叫做years。
- 把它的interest_rate除以periods(通常是12)。我们把结果叫做i。
- 把periods乘以years。我们把这个结果叫做n。
- 计算(1+i)的n次方。
- 把结果乘以principal。这就是你的新的余额(或负债)。
对这个例子,你需要两个DTML Method叫做interestRateForm及interestRateDisplay分别来收集使用者的资料并显示出来。你也需要一个python script叫做calculateCompoundinginterest来做真正的计算。第一步是在interestRateForm里建立一个网页表单以收集使用者的principal,interest_rate,periods跟years。接着是interestRateForm DTML Method的范例::
<dtml-var standard_html_header>
<form action="interestRateDisplay" method="POST">
<p>Please enter the following information:</p>
Your current balance (or debt): <input name="principal:float">
Your annual interest rate: <input name="interest_rate:float">
Number of periods in a year: <input name="periods:int">
Number of years: <input name="years:int">
<input type="submit" value=" Calculate ">
</form>
<dtml-var standard_html_footer>
这个表单收集资料而且呼叫interestRateDisplay method。现在,建立一个python script叫做calculateCompoundingInterest,它接受四个参数,principal,interest_rate,periods,years,范例如下::
## Script (Python) "calculateCompoundInterest"
##parameters=principal, interest_rate, periods, years
##
"""
Calculate compounding interest.
"""
i = interest_rate / periods
n = periods * years
return ((1 + i) ** n) * principal
把参数打进参数例里,然后把程式码放在本文区域里。当在网页编辑时,程式码一开始的注解并不是必需的(但如果是透过FTP编辑就需要这些注解)。
这会传回经过了多少years后的复利结果。接下来,建立一个interestRateDisplay DTML Method呼叫calculateCompoundingInterest并传回结果::
<dtml-var standard_html_header>
<p>Your total balance (or debt) including compounded interest over
<dtml-var years> years is:</p>
<p><b><dtml-var expr="calculateCompoundingInterest(principal,
interest_rate,
periods,
years)" ></b></p>
<dtml-var standard_html_footer>
先检视interestRateForm DTML Method。现在把你的余额或负债资料填入,然后按Calculate。这会让interestRateForm把资料送出到interestRateDisplay,它会呼叫python script calculateCompoundingInterest。这个显示method用script传回的值来显示结果。
就如我们之前所说,运用script的可能性是无穷的。然而这个例子给你一个常用的模式,呈现物件收集并显示资料,而程式逻辑物件做计算。
运用Method
Method是Zope中可执行的物件。Method这个名称是有点误称,它在Zope中的使用慢慢的变成像常用的Script跟Template。
Zope有两种method,DTML Method跟SQL Method。DTML Method是用来定义呈现样板,它可用在内容物件像DTML Document跟File。DTML Method常见的用法是定义呈现输出结果。
SQL Method内含有资料库查询让你的网页应用程式可以重复使用。SQL Method会在第10章 关联式资料库连接中提到,会有一个用关联式资料库来建立网页应用程式的例子。
在Zope中所以的物件都可以呼叫它们的method。例如,Folder物件有一个objectValues method 会传回包含在资料夹里的物件。DTML Method可用来写简单的script以呼叫 Zope的API method,这些 method在说明系统里有文件说明,在API文件里。
在Zope2.3中引进了两种新的Script是基于两个流行的程式语言,Python(Zope是用它写出来的)跟perl。你可以用python 跟perl script来写出更复杂的script,而不该用DTML Method。当你看Zope以前的文件,mail list,跟其它在Zope.org的资源。你会发现很多很复杂的DTML script。这些都是在python跟perl script出来以前。通常,复杂的script应该用python或perl来写。python 跟perl script在下一章会提到,在第6章也有许多使用的例子。
使用DTML Method的简单例子是建立一个用DTML Method在根资料夹中叫做objectList::
<dtml-var standard_html_header>
<ul>
<dtml-in objectValues>
<li><dtml-var getId></li>
</dtml-in>
</ul>
<dtml-var standard_html_footer>
当你检视这个method,它会在根资料夹上呼叫objectValues method而且秀出一个根资料夹中中所有物件的清单,就像Figure 3-7。
所以的资料夹都有objectValues method。这个objectValues method是ObjectManager的一个介面。
除了在物件上呼叫API method,DTML Method也可以用来延伸任何的Zope物件。在下一章会有更多的说明。这个方法能让你仅用DTML Method就能延伸Zope API。
你已看过了objectList method , 它在根资料夹里,做出根资料夹的内容清单。因为method是在根资料夹内,它可以被用在根资料夹里或根资料夹之下的物件。这个method延伸了Zope API,因为它提供了另一个可呼叫的method。
为了展示,让我们建立一个子资料夹叫做Primates并加入三个文件Monkeys,Apes,Humans。你可以在Primates资料夹上呼叫objectList method,只要你用URL Primates/objectList。你可以看到objectList method是定义在根资料夹里,但用在根资料夹上跟用在Primates的效果是不一样的。objectList虽然定义在根资料夹,我们可以用来显示Primates资料夹的内容。这种重复使用的机制叫做acquisition,这会在第4章有更多的说明。
DTML Method主要是用来当做呈现样板。DTML Method可以像样板连结可重复使用的内容到动态网页上。DTML Method的样板特征会在下一章讨论的更多。
DTML Document跟Method的比较
DTML Method跟DTML Document有着相同的使用者介面,初学者可能会有点搞混。在上一章所学的新增,编辑,检视,上传等动作,两者都是相同的。
Zope初学者常会搞不清楚的是两者使用的时机。两个看起来似乎是一样的。它们都包括DTML跟其他内容,它们都执行DTML,它们都有一个相似的使用者介面和API,那到底差别在哪?
DTML Document存放的是文件性质的内容。例如,一本书的不同章节可被放在DTML Document里。一般规则是:如果你的内容大多是文件性质要放在网站上,那就该放在DTML Document里。
DTML Method是用来处理及显示其他物件的。它通常不存放很多的内容,除非这些内容是用来改变或处理其他内容。
如果还是不清楚两者的差别也不用担心。即使是有经验的Zope程式设计师在做决定要使用何种物件时也要想一下,希望这本书能够厘清你的混淆之处。以下有一些规则可以帮你决定要使用DTML Docment或Method:
- 如果是内容,用DTML Document。
- 如果是简单逻辑,用DTML Method。 - 如果会被其他物件呈现,用DTML Document。 - 如果是用来呈现其他物件,用DTML Method。 - 如果有复杂的功能,用python,perl script。
你已知道DTML Method是一个呈现及快速写script的有用工具,但最后你会想要一个更有威力的程式语言,这也就是使用script的时候了。
运用版本控制
版本控制物件帮助一群人可以在同一组物件上合作。当你编辑一个文件,别人可能同时在编另一个文件。在一个大型的Zope网站,可能同时有数百人甚至数千人同时使用。大部分都能正常运作,但问题可以会发生。例如,两个人可能同时编辑同一份文件。当第一个人改好存档,而第二个人的存档会盖掉第一人所做的改变。你可用一直用复原跟历史记录来解决这个问题,但这仍是个问题。Zope的版本控制物件可以解决这个问题。
另一个可能会遇到的问题是你想做一些改变,但你想要做好时才让大家看到。例如,你想要改变网站的选单结构。当别人在使用你的网站时,你不会想要同时修改,因为这样会暂时破坏你网站的导览系统。
版本物件是Zope中做私密性改变的方法。你可以对许多文件做改变而不让别人看到。当你完工时,你可以公开你的改变,或是放弃改变。你在版本物件里所做的改变并不会有时间的限制。例如,你可能要花一周的时间来完成你的选单系统。当你完成时,你可以完成你的版本物件以让你的改变公开。
在加入选单中选择Version就可以建立一个版本物件。接着你会看到新增表单。给它一个id叫做MyChangs,然后按下Add钮。现在你已经建立了一个版本物绵,但你还没使用它。要使用的话,点一下它。你会看到版本物件的Join/Leave标签,就像Figure 3-8。
这个版本物件说明了你现在还没有使用它。按一下Start Working in MyChanges?钮。现在Zope会告诉你,你已经在版本里面。现在回到根资料夹。注意到不管你到哪,都会在萤幕上方看到一段讯息告诉你,你现在在/MyChanges?的版本里。这讯息提醒你这时所做的改变都不会公开,但会被存在你的版本里。例如,建立一个新的DTML Document叫做new。注意到它的id后会有一个小红色方块。接着编辑你的standard_html_header method。加入一行变成如下::
<html>
<head>
<title><dtml-var title_or_id></title>
</head>
<body BGCOLOR="#FFFFFF">
<h1>Changed in a Version</h1>
任何在版本里所建立或编辑的物件都会有一个小红色方块。现在回到你的版本物件并按下Quit working in MyChangs?钮。现在试着回到new文件。注意到你之前在版本里所建立的文件已经不见了。还有所做的改变也不见了。注意到你的standard_html_header method后有一个小红色方块及一个锁的符号。这指出这个物件已经在版本里被改变了。在版本里改变一个物件会把它锁定,这样就没有人可以改变它,直到你在版本里完成或改弃这些改变。锁定确保你的版本改变不会盖掉别人所做的改变。所以假如想确定只有你对这个物件做改变,你可以在版本里改变它。除了保护不受未预期的改变,锁定也可能造成不方便,如果你想要工作的物件里别人锁定了。所以比较好的还是节制你的版本使用以避免锁定别人要用的物件。
现在点一下版本物件,按Start working in MyChangs?钮就可以回到你的版本。所有东西又恢复原状了。现在来让你的改变能永久生效。到Save/Discard标签,像Figure 3-9。
填入注解像This is a test到注解栏位,然后按下Save钮。现在你的变更已是公开的,而且在版本里所改变的物件都解除锁定。但目前你仍在你的版本物件里。到Join/Leave标签然后按下Quit Working in MyChanges?钮。现在确认你在版本里所建立的文件已可以被看到。你对stardard_html_header所做的改变也是可见的。像在Zope其他东西,如果想要你可以还原这些改变。到Undo标签。注意到你在版本里的变更只有一步,而不是很多步。假如你还原这一步,则所有在版本里的改变都会被还原。
版本物件是群组合作的一个很有用的工具。你不用跑一个运作中的伺服器跟测试用伺服器,因为版本让你可以做实验,做出来,然后当完成时就把它公布。版本一不限制只有你一个人用。一群人可以在同一个版本里。这样你可以在版本里一起合作,而仍保持这些改变不公开。
快取管理物件
快取是一个暂存的地方用来存放你常存取的资料。使用快取的原因是为了速度。任何种类的动态内容,像DTML网页或python script,每次呼叫时都要算一次。对简单的网页或快速的script通常没有问题。对很复杂做大量计算或呼叫远端伺服器的DTML网页或script,存取它们可以会花很一段时间。DTML 跟python可以很复杂,尤其是你使用大量的迴圈(像是in标签或是python 的for迴圈)或你呼叫大量的script等等。花很多时间的计算可称做耗费大量的。
快取可以帮你的网站加速,只要呼叫耗费大量的网页或script一次,然后把结果存起来就可以重覆使用。第一个呼叫这个网页的人会有较慢的反应时间,但是只要计算的值被放在快取,之后呼叫同一网页使用者会有很快的反应时间,因为他们从快取中得到一份结果而不是像第一个人做耗费大量的计算。
为了让你有个概念关于快取如何增进你的网站速度,想像你正建立www.zopezoo.org,而且网站的首页是很复杂的。假设这一页有很复杂的档头,档尾,查询多个不同的资料库,然后呼叫很多特别复杂的script会解析查询的结果。每次有个人来到www.zopezoo.org,Zope必需计算这很复杂的网页。为了要做示范,假设这复杂网页计算一次要花半秒钟或500毫秒。
假如算这个假想的复杂网页要花半秒钟,而你的机器每分钟只能服务120次。事实上,这个数字可能会更少,因为Zope还得处理一处其他事。想像如果你把这一页快取起来。因为从快取中得到网页不需要耗费大量的计算,较多的人可以看到网页。例如,要10毫秒来显示一个快取的网页,这一页会为访客省下50倍的时间。cache跟Zope真正的效能依赖你的电脑跟应用程式,但这个例子给你一个概念关于快取如何加速你的网站。然而快取也有一些缺点:
快取存活时间
假如网页被快取一段很长的时间,就没办法反应出网站现在的资料。如果你的资料变动很快,快取会把新资料隐藏起来,因为快取保留了旧资料。资料被保留的时间就叫做 快取存活时间。
个人资料
许多网页会为使用者提供个人化设人。很明显地,快取这种资料会有个人隐私上的考量,因为使用者不该拿到别人的资料。因此,快取通常不保留个人资料。
Zope允许你设定快取策略来处理这些问题。快取策略让你可控制如何快取资料。快取策略可用快取管理物件来控制。
增加一个快取管理物件
快取管理物件可像其他Zope中的物件被新增。目前Zope有两种快取管理物件:
HTTP加速快取管理物件
这个允许你控制Zope外部的HTTP快取伺服器,例如,Squid。HTTP加速快取管理物件本身不做快取,而是设定特别的HTTP表头来告知外部的快取伺服器。设定像Squid的外部快取伺服器已超过本书的内容,你可以去Squid网站得知更多细节。
(RAM)记忆体快取管理物件
这个Zope快取管理物件会把内容资料快取到电脑中的记忆体。这样的速度很快,但会让Zope消耗更多记忆体。它不需要任何如Squid的外部伺服器。
为了示范,在根资料夹建立一个记忆体快取管理物件叫做CacheManager。这将会成为整个网站的快取管理物件。
现在,按一下CacheManager去看设定画面。在画面上会有一些项目:
Title
快取管理物件的标题。可填可不填。
REQUEST variables
这个资料是用来存快取的网页。这是进阶设定,现在让它是原来的AUTHENTICATED_USER就可以。
Threshold Entries
快取管理物件一次能快取的物件数。
Cleanup Interval
快取资料的存活时间。
目前只要保留原来的预设值即可。这样就可以设定好一个快取管理物件。
快取管理物件还有一些你可能会觉得有用的标签。第一个是Statistics。这会告诉你快取的命中及没有命中数目,由此可知快取的效取的效率。
有一个Associate标签让你连结特定的Zope物件到某个快取管理物件。例如,你可以只想要快取DTML Documents。你可以变更Associate标签中的设定。
做到现在,快取还没有作用,你只是建好了一个快取管理物件。下一节会告诉你如何快取文件的内容资料。
将文件快取
将文件快取是非常简单的。首先,在将文件快取起来之前,你必须有一个如前一节中所建立的快取管理物件。
为了要将文件快取,在根资料夹建立一个DTML Document叫做Weather。这个物件会包含一些天气资料。例如,假如它包含了::
<dtml-var standard_html_header>
<p>Yesterday it rained.</p>
<dtml-var standard_html_footer>
现在,点一下Weather然后点一下Cache标签。这个标签让你将这个文件连结到一个快取管理物件。假如你点出选取盒的下拉选单,你会看到在前一节所建立的CacheManager。把它选起来当做Weather的快取管理物件。
现在,不管任何时候任何人要看Weather文件,他们会得到快取后的资料。对一个像Weather这样简易的文件,快取没有太多的好处。但如果Weather包含一些资料库的查询。例如::
<dtml-var standard_html_header>
<p>Yesterday's weather was <dtml-var yesterdayQuery> </p>
<p>The current temperature is <dtml-var currentTempQuery></p>
<dtml-var standard_html_footer>
假设yesterdayQuery跟currentTempQuery是SQL Method,它们分别会查询昨天的预报跟现在的温度(想知道更多关于SQL Method,请看第十章)让我们假设在资料库里的资料每小时改变一次。
如果没有用快取,每次看Weather时都会去查询资料库。假如Weather一小时内会被浏览几百次,这几百次的查询都会包括相同的资料。
然如,假如你指定这些文件应该要被快取,那只有当快取过期时才需要去查询资料库。预设的快取存活时间是300秒(5分钟),这样的设定会变成十二分之一的资料库查询来减少约91%原来的量。这方法有一个要权衡的地方是每五分钟可能资料就会过期,但这通常是个可接受的折冲。
要知道更多关于快取的资料跟进阶的选项,请看Zope Administrator's Guide。
虚拟主机物件
Zope有三个物件来帮你做虚拟主机,SiteRoot,Set Access Rule,Virtual Host Monster。虚拟主机是提供许多网站在一台Zope伺服器的方法。这是一个进阶的管理功能,这已超过这本书的范围。请参考Zope Administrator's Guide。
用MailHost送信
Zope有一个物件可用来送外部的e-mail,常通会跟 DTML的sendmail标签一起使用,在第七章会有更多的说明。
Python跟DTML可用Mailhost在internet上发电子邮件。这功能像是通往世界的匣道。每个mailhost物件都连结一个邮件伺服器。当你做好连结时,mailhost物件就可让你用那个伺服器来送信。
从新增选单选择MailHost可建立一个mailhost物件。你可以看到预设的id是MailHost,而预设的SMTP伺服器及连接埠分别是localhost跟25。确定你的机器有跑邮件伺服器,或把localhost改成你的外送伺服器。
现在你可从DTML sendmail标签来使用新的MailHost物件。这会在第七章有更多的说明。MailHost物件的API让你从Python中来送信。请参考线上求助系统以得多更多的资料。
