Skip to main content

· One min read

根據 Sean Kelly 的 framework comparison screencast 的影片演示, 他比較了 J2EE, Rails, Zope, TurboGears, and Django 幾個框架. TurboGears 在其中得到了不錯的評價,然而他所使用的 TurboGears 版本還沒引入網頁自動生成資料庫編輯介面 (CRUD) 等 0.9 版新加入,可以大大減少初期開發時間的功能. 因此我利用他的 Time Tracker 例子和資料模型寫了篇用上 TurboGears 0.9 新功能的教學文章 (英文), 貼在 TurboGears Trac 裡,可以前去下載.

QuickPrototyping: Making a Time Tracker in TurboGears http://trac.turbogears.org/turbogears/wiki/QuickPrototyping

· 2 min read

在 TurboGears 中可以用 "@validate ()" 裝飾方法來處理輸入表單參數的轉值與驗證。使用的好處是除了會自動確認型態的正確性之外,還會將字串轉換成目標型態.

例如拿前一個網頁加法器作例子,原來例子中加總結果必須先將字串轉換成目標型態,因此計算式如下 SUM = (int (A)+int (B)) 我們可以使用 "@validate ()" 來預先先確認輸入資料,並將資料轉換成預期的資料型態. 範例如下:

from turbogears.validators import *
@expose(inputform ="add")
@validate(validators=dict(A=validators.Int(),B=validators.Int()))
def calcit(self,A=0,B=0, SUM=0):
template = """
<form name="add" method="post" action="/calcit">
<input name="A" type="text" value="%d"/> + <input name="B" type="text" value="%d"/>
<input type="submit" value="=" /> <input name="SUM" type="text" value="%d"/>
</form>
"""
SUM = A + B
return template%(A,B,SUM)

@validate(validators=dict(A=Int(),B=Int())) @validate(validators={"A":Int()}, "B":Int())

現在例子中由於已經預先將字串轉換成目標型態,因此可以直接加總 SUM = A + B

這讓程式碼可讀性更進一步增加了.

總結

validate ()" 方法除了可以幫忙我們判斷回傳值型態外,同時也會將回傳值從傳回的字串型態轉換成指定型態供我們處理

除了這些簡單值的字串轉換外,在 TurboGears 中做 email 地址確認時,甚至還能選擇確認 email 主機是否真正存在喔;)

· 4 min read

TurboGears 中可以使用從模板生成網頁 (Templating) 的方式,可以更好地將控制邏輯與操作介面分開,來達到程式碼與網頁分離的需求。讓程式與網頁更易於維護.

使用 TurboGears 中的預設模板,可以用所見即所得 (WYSIWYG) 網頁編輯器來編輯網頁外觀. 並在回傳時用字典 (dict) 形式傳回變數,降低程式碼與網頁之間的直接關聯性.

讓我們用模板功能取代將網頁用字串存在 controllers 中的方式:

1. 建立控制邏輯 (Add Logic)

0 from turbogears import controllers
1 from turbogears import expose
2 class Root(controllers.RootController):
3 @expose(template=".templates.filename")
4 def webpage(self):
5 return dict()

透過在 @expose () 方法中加入 template=".templates.filename" 宣告來指定要使用的模板名稱.

return 型態必須是字典型態。裡面傳回的內容則可以動態被填入模板中

2. 建立模板

我們建立 "filename.kid" 的模板. 模板名稱要跟 controllers 中 @expose (template=".templates.filename") 的 filename 相符

3. 模板宣告

模板要使用 XHTML 格式來撰寫.

從 HTML 轉換到 XHTML 的主要差別在於 XHTML 對網頁語法有較嚴格規定

  • 在 html 標籤內加上 <html xmlns:py="http://purl.org/kid/ns#"/> 宣告,表示這是一個 TurboGears 的模板,在執行的時候 TurboGears 才能正確地將自行設定的變數替換成適當的值

  • 所有的標籤要對稱,單一的標籤要以 / 作結尾。例如 <br> 變成 <br/>, <input> 變成 <input/>

結論

前幾分鐘裡的範例都是在 Controller 中將網頁用一個 "template" 字串來表示,直接將網頁內容存在 python 程式裡。然後用傳回值 (return) 的方式將 "template" 字串轉換成網頁顯示出來. 用這種方法寫網頁程式,好處是我們只需要將網頁程式當作一般程式來處理就行了,不需要了解太多複雜的動態網頁技巧,利用這樣的方法,我們需要仔細處理插入變數的類別,並在回傳時注意變數的安排順序,好正確地將字串中的變數替換成我們期望的樣子. 我們很快地就發現這樣將網頁內容嵌在程式碼裡的寫作方式,隨著漸漸增加的功能方法,與要求更複雜的內容呈現時,程式碼就變得越來越難以維護.

我們應該要擁有方便的工具,可以用任意順序傳回我們想要顯示的內容,並在實際的網頁上重複運用這些資訊。最好還可以用一般的所見即所得 (WYSIWYG) 網頁編輯器來編輯網頁外觀,

· 2 min read

程序維護是不同於程序開發的 要想維護一個程序,就要把程序看作是一棵漸漸成長的植物,拔苗助長是毫無益處的。一個程序必須被小心地滋養。程序員在對程序進行改動之前,必須對每一個邏輯關係非常熟悉,必須對程序的意圖有很深刻的理解力。這種理解力不是在一夜之間就可以得來的,需要長時間的積累。 -編程之禪

編程之禪實在是蠻唬人的文章,不過其中也有些的內容令人有所感觸

我編程三日, 兩耳不聞人聲, 只有硬盤在歌唱。 一台沒有靈魂的機器,人們說, 但它的靈魂是同事們的汗水, 在它裡面有我們多年的生命,

...

我聽見了歎息和歡笑的回聲, 在這間黑洞洞的辦公室裡, 終端機閃耀著光芒,就像星星一樣。

· One min read

Selenium is a test tool for web applications. Selenium tests run directly in a browser, just as real users do

Selenium 是網頁程式測試工具,可以跨平台跨瀏覽器模擬各種使用者可能的操作. 主要的兩個功能是:

  • 瀏覽器相容性測試 (Browser compatability testing)
  • 系統功能測試 (System functional testing)

Selenium 在內頁框 (iframe) 中,使用 JavaScript 自動化引擎來模擬使用者操作網頁的動作, 可以安裝 IDE (firefox 插件) 來使用 selenium, 或是在 TurboGears 中也可以使用 Selenium , 看看 Selenium4TurboGears 的介紹影片吧