用自由軟體Plone來架設網站(1)


作者:胡崇偉
文章出處:網管人
文章連結: https://www.netadmin.com.tw/netadmin/zh-tw/technology/BA9F59EABCD2459381D5E8CEBA479A94

架站軟體的選項很多,為什麼要選擇Plone呢?最大的幾項優點包括以下幾項。首先,它以Python語言開發而成,容易入門,具備企業級的功能彈性,可部署在VPS或Amazon EC2雲端系統上。

其次,它由廣大積極的社群朋友所支持,擁有絕佳的升級相容及系統安全紀錄,並且支援多國語言。根據評比資料,Plone在同類軟體裡,多個評分項目都拿到中上的成績,算是開放源碼裡的通才工具。
安裝Plone很簡單,下載安裝檔案後,很快就在Windows或Linux等環境完成架站,它的內建工具已能滿足常見的應用場合,像是wiki編輯環境、TinyMCE編輯器等,加上會員管理及工作流程的支援後,搖身變為企業級的內容管理系統,這些都是它的應用彈性,協助內容管理人員輕鬆經營網站。

另一方面,Plone也照顧程式開發人員的需求。它搭配一套開發框架,以及一系列的擴充工具和測試工具,可以新增或開發各式模組,為系統增加其他功能特色,包括支援多媒體的表單、提升視覺體驗的AJAX特效、結合Google Map或Subversion等常見的外部系統。 本文將以Plone網站開發框架為主角,進行名詞解釋,並介紹Python專案開發工具的操作方式。

Plone的開發框架


早期,Plone只是一個內容管理系統(Content Management System,CMS)模組,後來才衍生出開發框架。

它以Python和Zope為基礎,2011年的此刻,不少Plone實作品還處於轉型的階段,網路上不容易找到完整而穩定的文件。

本文的目的之一,就是試著說明Plone開發框架的最新狀況,包括版本、模組註冊方式、設定檔格式等。

開發框架通常扮演網站系統的中間層角色,它的底層是程式語言和作業系統環境,它的上層是應用程式,為了快速滿足應用程式的設計需求,開發框架必須提供一致的介面和邏輯思惟,讓開發人員藉以解決問題。

Zope最早是一個Application Server系統,同時也是一個開發框架,目前版本分成Zope2和Zope3兩種體系,前者版本號碼以Zope2-2.12.x方式來命名,後者則以zope.x方式來命名。

簡單地說,既有的Plone 3.3.x和Plone 4.0.x版本,混用了Zope2和Zope3的功能和技術,混用的目的是為了維護應用軟體的相容性,不過,這也帶來版本相依性的議題。首先,我們要知道如何選用Python的版本。

Python版本的選用方式


Plone 4.0是個分界點,在此之前使用Python 2.4版本,之後使用Python 2.6版本,原因在於Zope的支援程度不同,例如Plone 3.3.x使用Zope 2-2.10.x,必須搭配Python 2.4。從Plone 4.0.x開始,使用Zope 2-2.12.x以上的版本,底層也升級為Python 2.6。

這個改變造成Plone 4.x執行效能大幅提升,若配合使用plone.reload工具,修改程式碼過程就不需要重新啟動伺服器,可以再加快開發時間。

額外的效益還包括,記憶體的使用量減少了,以往512MB RAM的電腦跑不動Plone 3.3.x,現在可以順利執行Plone 4.0.x。

真是複雜,那該怎麼選呢?剛接觸的朋友,建議使用Plone 4.0.x和Python 2.6.x環境,並且直接下載安裝檔來起步。下列將以Ubuntu Linux示範指令,動手操作會更容易探索系統。

安裝檔快速起步


Plone的安裝檔稱為Unified Installer,以4.0.2的安裝檔為例:

■圖1 Typora 下載及編譯安裝。

最後,畫面顯示admin帳號的密碼,它是首次安裝時的管理者帳號密碼,這組帳號密碼也會記錄在adminPassword.txt檔案裡。完成編譯後,會產生「Plone」目錄,內含「Python-2.6」、「zinstance」、「buildout-cache」、「Plone-docs」四個目錄。

顧名思義,Python-2.6就是Python系統目錄,即使你的Linux已經裝好Python,安裝檔還是再送給你一份,這樣的好處之一,是擁有獨立的底層函式庫,特別適合測試開發的場合,搞亂系統的話,砍掉重練即可。

zinstance是zope instance的縮寫,系統運作過程所產生的動態資料,都會記錄在這裡,它也是管理工作的起始目錄,存放著記錄系統配置的設定檔,在「bin」目錄裡,也存放許多系統工具程式。

■圖2系統工具程式目錄。

「buildout-cache」目錄裡存放許多egg程式碼,egg是Python建構各式應用軟體的元件單位,它的功能類似Java的jar(Java ARchive),或是Ruby的gem。以Plone為例,它是由上百個元件單位組成,並利用Buildout工具程式來管理元件的安裝與升級,因此,認識Buildout的運作機制,成為開發過程的重要工作。

系統配置設定檔


Buildout程式執行時,預設需要搭配buildout.cfg設定檔,檔案裡記錄系統配置的資訊,首次啟動Plone前,可以查看想要修改哪些設定值,下列是部分設定範例:


Plone預設在port 8080啟動,想要更換port號碼的話,可以修改http-address的設定值,另外,若想要更換admin管理者起始密碼,可以修改user的設定值。

每次修改buildout.cfg檔案後,都要執行指令「bin/buildout」讓設定值生效。成功生效之後,再執行指令「bin/plonectl」來啟動系統。啟動的參數分成fg和start兩種,分別代表前景執行和背景執行。

首次啟動系統的話,可以使用「bin/plonectl fg」指令,它會把系統執行訊息顯示在螢幕上,讓管理者即時觀察,這時候可以按〔Ctrl〕+〔C〕快速鍵來停止系統執行。

若使用「bin/plonectl start」指令啟動的話,就可以用「bin/plonectl stop」指令來停止。

建立Plone網站


成功啟動後,在瀏覽器輸入「http://localhost:8080/」之類的網址,會出現Plone的起始網頁。

■圖 4起始網頁。

首次啟動的話,必須先新增Plone網站。填寫的資料當中,以網站識別碼最重要,它會成為網址的一部分,以mysite為例,它的網址格式會是「http://localhost:8080/mysite」這樣。

■圖 5網站新增表單。

使用管理者admin帳號密碼登入Plone網站後,先示範如何從管理前台新增會員帳號。

■圖 6由Site Setup進入管理前台。

首先,要設定帳號的安全政策,點選其中的「Security」項目。

■圖 7管理前台的清單項目。

勾選「Let users select their own password」,這樣在註冊帳號時,就可以自行選擇密碼。

然後,到「Users and Groups」新增一組帳號密碼。

■圖 8設定安全政策。

預設的會員帳號,屬於Member角色,當然,管理者可以在這裡指定其他角色,或是刪除這個帳號。

接著,開啟「另一種」瀏覽器,就可以同時觀察管理員和一般會員在登入系統時畫面有哪些不同。因為帳號資訊是以cookie方式儲存,要用不同瀏覽器,才能讓帳號同時操作系統。

■圖 9新增帳號。

■圖 10帳號管理。

內容管理

Plone預設提供的內容項目,包括Page、News Item、Event、Image、File、Link、Folder、Collection等,這裡介紹News Item的新增方式。

先由管理員到「News」目錄,從Sharing指定一般會員帳號「Can add」的權限,這代表指定的帳號,可以在「News」目錄裡新增內容項目。

■圖 11指定帳號權限。

一般會員進入「News」目錄後,從「Add new...」選單可以點選「News Item」選項來新增。

■圖 12新增內容項目。

填寫「News Item的」各項欄位後,就可以將內容儲存。

至於儲存的內容項目,預設是Private狀態,可以選擇「Submit for publication」選項提交給管理員,進行審核及發佈。

■圖 13編輯內容項目。

■圖 14顯示內容項目。

物件資料庫


一般的LAMP系統,常見使用MySQL來儲存內容,Plone則是使用ZODB來儲存內容。網頁內容屬於半結構式資料,理論上並不適合完全套入資料庫的規範,使用物件資料庫顯得更直覺。當然,這不代表使用SQL儲存內容,不能提供優異的網站服務。重點在於,開發過程的思惟,它們有著根本的差異,經由MySQL議題的廣受討論,相信更多人將逐步認識它們的差異。

那麼,哪裡找得到Plone存放的內容呢?在「Plone/zinstance/var/filestorage」目錄裡,找得到一個Data.fs檔案,它就是ZODB存取內容的實體檔案,系統運行過程,就會發現Data.fs增加大小。新版的Plone已經增加BLOB支援,在「Plone/zinstance/var/blobstorage」目錄裡,存放的是Plone系統內的圖片、影音檔案,大幅改善以往ZODB容易過度膨脹的問題。

想要看到Data.fs裡的內容嗎?plonectl工具程式提供一個debug參數,讓使用者進入除錯模式來觀察ZODB內容。所有的物件以「app」為根目錄,使用app.mysite就能存取Plone網站,使用app.mysite['news']代表存取「news」目錄。除錯模式的操作方法,對於Python朋友而言,並不陌生,更多的樂趣,先留給各位自行探索。

■圖 15除錯模式。

另外,透過ZEO可以支援多個客戶端存取,讓ZODB的延展度提升,企業級的部署規劃肯定需要這樣的功能。不過,初學者可能只關心,該怎樣備份Plone的系統資料呢?最簡單的方式,只需要把Data.fs和blobstorage內的檔案複製起來,就完成備份。

結語


網頁程式發展十餘年了,今日已有許多工作和生活應用,彈指之間就由網站服務完成,透過這樣的普及與內化過程,我們反而更不容易窺見它們的運作原理。內容管理系統是網頁應用程式的具體產品,它能完整示範一個通用式的網站,該具備哪些功能與特色。筆者把Plone當成樂高積木,藉由拆解和組合的過程,認識網站應用程式的奧秘。邀請想要探索奧秘的朋友,一起發掘DIY的樂趣。