Skip to main content

· One min read

I wrote a doc in TurboGears doc site: Wrap AJAX operation in Widgets, which demonstrates how to use the widget to do basic AJAX operation as Rails 'link_to_remote' helper.

The RemoteLink widget works differ from Rails 'link_to_remote' helper. It's simple, pure python(while you use it) and fully 'optional'! 'Optional' means if you remove the widget, your site still functional. Thanks to the mochikit cool functions :-)

· One min read

Python tw 星球上最近刮起了 wii 的風潮,

我托日本同事買的 wii 也在昨天到了 XD 一同購入的是 wii Sports 跟第一次接觸.

看來有機會辦 python 使用者聚會啦 (一起玩 wii 才是真 XD)

· 4 min read

這兩年隨著 Ruby On Rails 爆紅而在各語言上都紛紛出現許多相應的輕量框架 (framework). 這些輕量框架由於存在的時間不長,他們開發的過程都是先從幫助使用者快速上手開始,接著考量 web 功能的完整性,再來才是進一步調整框架的效能. (make it work, make it work well, make it small)

這篇文章的回覆裡看到一段敘述: "我自己都用 c/c++ 寫 apache handler 搞網站,速度.. 熟了,速度還出不來嗎?" 我必須說他講的沒錯,有沒有框架對高手可能沒差別,就算使用框架他也可以根據對語言 / 網站開發的理解自行修改,達到最好的效能。因為他對 web 開發的理解已經隨心所欲了 :-)

當然最後當你開發的服務使用的人多了,還是要回歸效能上來考量. 那麼為什麼這些框架卻能吸引這麼多人關注哩?

個人覺得長久以來的開發方式對比輕量框架開發,就好像要花數十年苦功才有成的中國功夫對比相對速成的空手道... 又或使用有關鍵字加亮的文字編輯器對比使用所見即所得的 Dreamweaver.

大家看事情的角度不見得相同,如同大家練功夫的目的不見得都是要靠功夫吃飯。對於 hobby web programmer 來說效能不是第一考量,易上手與開發的方便性才是吸引大批人的原因.

對以網頁開發維生的人而言,RoR 號稱 10 倍效能這點有好有壞。但無論如何廣告效果達到了; 對以興趣為主的開發者來說,能節省時間的方便開發工具卻代表了在他們休閒時間除了都花在設計自己感興趣的網站外,還可能空出了陪女朋友看電影的時間.

我從去年六月多就從 Oreilly OnLamp 網站的 Tutorial 中接觸過 RoR 了,個人覺得 RoR 的設計觀念相當紮實,但是進一步的使用上並未感覺有這麼好.

我認為 RoR 強調的約定高於配置 (Convention over Configuration) 的觀念很棒,但是在 RoR 中實在太多約定了,記不清的約定就變成了需要記憶的 Magic.

另外個人的原因之一是已經學會了 Python 語言後再看同為動態語言的 Ruby 語言並沒有吸引我的地方。要掌握好一門語言需要的不只是 20 分鐘的時間。同為動態語言,在程式的可讀性上 Python 語言好太多了.

而且 RoR 太多依賴特用語言 DSL (Domain Specific Language) 了,RHTML, RJS 等等神奇的樣板看起來並不那麼的易讀或可維護.

另外在學習的過程中我感覺學習 RoR 並不等同於在學習 Ruby 語言. 而要進一步深入使用框架,不瞭解語言是不可想像的.

· 7 min read

許多人以為 TurboGears 能跟 DjangoRuby on Rails 比較的地方只是因為一個分散組件,一個集中開發.

但 TurboGears 好用的地方並不是在它堆砌了許多開源的 python web 專案 (如不曾成功過的 subway), 而是真正提出了一個整合這些 python web 開發資源的方法。並提供相當具有 python 風格 (pythonic) 的使用方式.

1. Decorator 形式的 Dispatcher

TurboGears 的多數的秘密存在於 Decorator (用 "@" 符號開頭的敘述) 中. Decorator 是 python 2.4 後才引入的特性, 適度使用可以讓程式碼更清晰.

TurboGears 基本的網頁型態是這樣:

>
> @expose()
> def index():
> return

基本的 pyhton method 加上 @expose() 這個 decorator 敘述, 讓 server 知道這個函式是 public to web 的.

需要登入認證功能,就再加一個 @identity 敘述

> #auth_admin_required = identity.in_group("admin")
> @identity.require(auth_admin)
> @expose()
> def index():
> return

如此被裝飾到的網頁就有了認證功能.

同樣形式的還有

@paginate # 分頁功能 @validate # 表單驗證功能 @error_handler #錯誤處理功能 @exception_handeler #例外處理功能

等特殊功能.

@validate 表單驗證的功能除了驗證表單參數, 還負責將參數從字串轉換成 python native 格式,可以對網頁傳過來的參數直接用 python 做處理.

@error_handler 和 @exception_handeler 被用來對應表單驗證功能 讓我們可在同一個函式裡處理錯誤,或另外定義函式做錯誤處理

>
> @error_handler("index")
> def ex_report():
> return "exception"

2. 一個函式,多重輸出

很多人知道 TurboGears 在樣板選擇上的多樣性, 但是卻沒有挖掘到在 TurboGears 的神奇之處. 在 TurboGears 中使用同一個函式,就可以針對不同需求,輸出多種期望的格式.

>
> # 使用網頁樣板產生網頁介面
> @expose(template = "hello.welcome")
> # 產生 JSON 格式介面供 AJAX 程式調用
> @expose("json")
> #使用不同的樣板引擎, 產生RSS格式介面
> @expose(template = "genshitext:hello.hoho", as_format="RSS/XML")
> def show(self, **kw):
> return dict(name = 'foo', url = 'boo')

這是因為 TurboGears 回傳使用 python 特殊的 "字典 (dict)" 形式, 而不是一般常見的字串形式 (當然 TurboGears 同樣也可以直接輸出字串).

當使用者要求網頁的時候,web server 決定好對應的 method 運行後, method 輸出字典型式的返回值到 decorator. 再根據 @expose decorator 的判斷條件, 取用適當的樣板配合字典來生成適當的介面.

原本需要自行將樣板與內容 "串連 (serialize)" 的工作,TurboGears 都幫忙我們完成, 讓我們只要專注在程式邏輯上即可.

要從別的 method 調用這個函式不同的輸出也很容易, 只要在返回值裡加上一個 "tg_format" 參數即可手動指定輸出格式.

>
> @expose()
> def rss():
> return rss(tg_format = "RSS/XML")

3. 簡單設定

通常在 TurboGears 中要讓一個資料庫程式運作, 只要在 dev.cfg 裡指定好對應的資料庫路徑 (dburi), 就可以開始資料庫網站的開發. TurboGears 自會幫忙處理初始化的動作,並且提供相應工具.

要改換整個網站的預設樣板引擎,同樣也是一行設定搞定.

tg.defaultview = "genshi"

程式裡往往會有些可以讓使用者修改預設運行設定的地方, 如在程式裡要取得預設的模板引擎,可以使用

> config.get("tg.defaultview")

來取得預設的模板引擎。取得其他設定值也是使用同樣的方法.

TurboGears 開發的應用程式在發佈 / 安裝上相當容易. 使用易用的 setuptools python 套件發佈功能, 安裝時能自動抓取使用到的 python modules.

4. 高擴展性

TurboGears 框架是個組合框架 (meta framework), 因此設計之初就把高擴展性視為重要目標. 只要在 console 中使用 tg-admin info 命令就可以一窺 TurboGears 擴展的面目。你會驚訝地發現其實 TurboGears 大多數的功能都是透過擴展實現.

TurboGears 使用的擴展方式是透過 python setuptools 的 entrypoint, 撰寫自己的擴展並不需要改動 TurboGears 的原始碼. 安裝擴展也可以透過 easy_install 命令自動從 python cheese shop 下載組件.

5. 與 Python 社群互利

TurboGears 並不是一個只取不予的開發框架, 一方面 TurboGears 降低了試用各 python web modules 的難度, 使得各專案能吸引更多使用者,也加快了各專案的成熟度;

另外一方面,除了多數 python modules 都可配合 TurboGears 使用之外, TurboGears 框架中所開發出來的工具也都盡量朝能獨立於框架外使用的方向邁進.

近期的成果是 ToscaWidgets, 將 TurboGears 中方便重用的 widgets 獨立出來, 可在 pylons, web.py 等框架和工具上使用.

TurboGears 在組合框架上,不只是達到功能上的滿足,還達到與 python 語言使用上的一致性. 充分使用各種 python 語言的特性與工具,沒有過多的 Magic. 這是許多追趕的組合框架應該思考的.

PS: 對 Open Source Project 來說,一個好的文件網站也很重要