robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
ez_web
by thinker
2 Columns
關鍵字:
Python
ez_web-0.1 剛剛 release 。什麼是 ez_web ?是鄙人實作的一個 $WEB$ framework ,如前面所說的, design for change 。原本更晚一點才會 release ,但看到 Eddy 的文章後,一時興起,整理一下程式碼,提早釋出。 https://opensvn.csie.org/traccgi/PumperWeb/wiki/ez_web ez_web 是整合 ez_xml/sqlcc 和 client side component 的環節,是鄙人最近一系列$研究$和發展的成果之一。目前釋出的成果包括 ez_web 、 ez_xml 和 sqlcc ,稍後一點的時間,還會釋出另一個 client side component 的 library ,至此整個架構才算完整。 == ez_web == ez_web 必需搭配 ez_xml 使用,最好也能加入 sqlcc ,但 sqlcc 決非必需品。 ez_web 的概念相當的單純 「以 $Python$ 為基礎,提供一個以 dictionary 作為資訊傳遞媒介的 $WEB$ template 環境。」,在如此單純的概念下,系統也相對的單純,programmer 能在短時間內了解,並進行修改,或新增功能。 以往的 framework ,大多不希望 programmer 修改 framework 的內容,而企圖提供上天下海的功能,滿足 programmer 的所有需求。但,這昧於人腦不精確的事實。 ez_web 基於此一事實,試圖提供一個 programmer 能輕易修改的「$範例$骨架」。每個 ez_web project ,都是從抄襲和修改 ez_web 這個一千多行的$範例$開始,因此 project member 能清楚的了解系統的來龍去脈。 == Coding By Example == $WEB$ Application 的 programmer ,應該都有到網路上找別人的 $javascript$ $範例$來抄的經驗。這些 $javascript$ 大都不具完整的功能,但卻很容易整合進我們原有的 code base 裡。這是因為這些$範例$沒有完整的介面,所以我們不怕打破它,我們大膽的把這些 $coding$ 抄進我們的 code base。而且這些$範例$,大多使用最基本的系統功能完成,不會其它 library 有太大的 couple ,所以容易了解。這就是 $coding$ by example 。(我不知道是否有其它正式的名稱) $coding$ by example 的菁華,在於 programmer 一開始就有一個可以 run 的東西,告訴 programmer 一個方向,然後再修改成自已要的樣子。透過這個方式,programmer 可以在很有自信的情況下,抄出自己所需要的功能,尤其適合於商業環境。商業環境上,大部分的需求都是重複的,有前例可循的。對於一個全新的需求, $coding$ by example 當然不管用。但事實上,就算有全新的需求,大部分的配合功能都是有前例的。 == Setup ez_web == ez_web 是 $Python$ 的 package,必需和 ez_xml 一起搭配使用。安裝時,先解開 tar-ball ,然後執行 python setup.py install 安裝至 $Python$ 目錄下。 ez_web 可以當成 $CGI$ 使用,但鄙人建議使用 mod_python + apache 。 mod_python+apache 的設定,必需在 project home 建立一個 .htaccess 檔,如下 {{{ #RewriteRule ^$$ /bricks AddDefaultCharset Big5 SetEnv LC_CTYPE zh_TW.Big5 <Files ez> SetHandler mod_python PythonHandler ez_web.mod_python_hdr PythonPath "sys.path + ['/path/to/your/project/home/']" </Files> }}} 這是在 Big5 的環境下的設定。其它的 charset ,聰明如你,應該能變通。 假設 project home 的 $URL$ 為 http://project/home/ ,則所有 http://project/home/ez/ 之下的 request 都會被 ez_web 所處理。這樣的設定,是希望只有 dynamic content 會經過 ez_web ,其它 static page 都可以交由 apache 自行處理,不用經過 ez_web 。 在 project home 底下,必需建立兩個 sub-directory , ez_controls 和 ez_templates ,並各自有一個 __init__.py 檔案。這是因為 ez_controls 和 ez_templates 是 $Python$ 的 package ,所以必需要有 __init__.py 。 == Hello World == 我們建立一個 http://project/home/ez/hello 的網頁,包括下面兩個檔案。 ez_controls/hello.py {{{ def process(req): import time req.dict_out = {'since1970': time.time() } return req }}} ez_templates/hello.xhtml {{{ <html> <body> Hello!! It is <span temp_act="replace_node('since1970')">1024</span> seconds since 1970. </body> </html> }}} ez_templates/hello.xhtml 是一個 ez_xml template,我們必需到 ez_template 目錄下,執行下面指令。 {{{ python -m ez_xml/compiler hello.xhtml > hello.py }}} 這道指令會產生 ez_templates/hello.py 這個 module ,用以 render ez_controls/hello.py 所產生的資料。 ez_controls/ 底下的 module ,被 ez_web 用來處理來自於 user 的 request ,以提供 user 要求的資料。例如,使用者 request http://project/home/ez/foo/boo 時,ez_web 就會找尋對映的 module ez_controls.foo.boo 。對映到目錄上,就是 ez_controls/foo/boo.py 。ez_controls 底下的 module ,被稱為 control。相對於 control ,ez_templates 底下的 module 稱為 template 。 control 的功能是提供 user 所要求的資料,這些資料以 python 的 dictionary 儲存,透過 req.dict_out 傳遞出去,並由對映的 template 處理, render 成 user friendly 的表示形式。如上例, control 產生自從 1970 年一月一日至今的秒數,將之放入 dictionary 裡,命名為 'since1970'。接著在 template 裡,就將 'since1970' 填入指定的位置。 ez_xml 在前面的文章 linkname:[從 Dynamic 、 script 到 $Python$] http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/193 有介紹過,透過簡單的 template 功能,只提供資料填入和依據 list 長度, loop 填入多筆資料的能力。 除了基本的功能, ez_web 還有 handle 整個 sub-directory , path rewrite 還有使用者認證等功能。這些都在簡單的一千四百行的程式裡完成,programmer 可以盡情的修改。 == 版本演進 == 或許有人會質疑,如果讓 programmer 修改 framework ,是否會造成和未來版本不相容的情形?我的答案是「這是多慮的」。首先,當原本的版本 run 的好好時,為什麼要換到新版本?其二,我們強調 $coding$ by example ,所有的東西都是易抄、易改。何不從新版的 ez_web 抄到你的版本裡呢? == 結語 == 這個故事還沒結束,整個故事必需等到 client side component library 釋出後,才算一個段落。 == 更多資訊 == * https://opensvn.csie.org/traccgi/PumperWeb/wiki/ * http://cheeseshop.python.org/pypi?name=ez_web&version=0.1&:action=display
最後更新時間: 2007-02-07 20:39:56 CST |
引用
查詢:
COMMENTS: