在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時,你看到
為什么會形成名字空間棧,那么它里面有些什么呢?(本人對此研究不深,只能說一說)當一個web請求發到Zope上來,Zope首先形成一個 REQUEST對象,它里面包含有Form變量,Cookie變量,CGI環境變量等。然后它會根據訪問的URL,一層層地查找相應的對象。查找的根據是按'/'進行分隔。因此這是一種通過URL來表現Zope對象或方法的一種方法。在 Zope中叫對象的公布(publish)。每找到一個則將其放入棧中,這樣就形成了一個對象棧,也就是名字空間。里面其實就是一個個的對象。這種組織的確使Zope變得復雜,但同時給編程帶來一些便利。這在后面“獲取”中會談到。對于這種名字空間,你可以進行修改。如使用
獲取(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(chatme@263.net),如要轉載請保留此信息。
(責任編輯:銘銘)原文轉自:http://www.anti-gravitydesign.com