在傳統的web開發中,如asp,jsp,php,psp都是把指令碼**與html**混合,使得業務邏輯與頁面邏輯混合在一起。這就會造成一系統的問題如可讀性較差維護起來也是非常頭疼,經常在隔了一段時間後看不懂自己寫的**,出現了頁面設計人員與程式開發人員的交叉分工作業衝突。
現在在jsp與php世界中出現了許多優秀的模板引擎,如jsp中的webmacro/velocity和php中的smarty。在python中也有不下20中的模板系統,python最新版本中就整合了乙個簡單的模板系統,並且在眾多的python web framework也大都整合有自己的模板引擎如django。而在karrigell中,雖然python inside html可以被當作模板系統使用但是由於縮排問題與效率低下的原因而不被經常使用。現在karrigell的2.x發行包已經把cheetah當作標準模組發布了。下面我們就介紹一下在karrigell中如何使用pih與cheetah模板系統。
那麼模板系統的作用是什麼呢?模板系統的目標是將文件的動態部分與其靜態部分分離。我們在python中使用模板系統就要迫使程式設計人員與ui設計人員首先要選擇模板系統,不過我在這裡推薦使用cheetah,cheetah的設計理念是:python適用於後端,cheetah適用於前端。如果我們遵循這條法測的話,使用karrigell+sqlobject+cheetah就可以組合成乙個類似於trubogears的mvc框架
使用python inside python
pih指令碼可以在karrigell server外用於建立html檔案,把它當作"模板系統"。
例如,下面的這個html文件是乙個pih指令碼。chapter號碼不是固定的但是可以像這樣插入到html中:
為了從乙個pih指令碼中處理html,可以使用template模組,可以使用getscript(filename)函式建立乙個指令碼的例項,然後應用它的render(namespace)方法,傳遞當前名字空間(通常是globals()或locals())它將會發現需要的變數。render方法返回乙個output例項,它的value屬性就是返回的html結果:
import template
pihin=template.getscript("pythoninsidehtml.pih")
chapter=5
htmloutput=pihin.render(globals()).value
當然我們也可把上面**的最後一行改造成:htmloutput=pihin.render().value
使用cheetah模板系統
cheetah是乙個用python寫的模板系統與**生成工具。cheetah提供了一門簡單語言,用來定義提供基本流控制和物件訪問的構造模板。
首先我們來看乙個簡單的例子:
2)在上面所提到目錄下面建立檔案index.ks,內容如下:
from cheetah.template import template
def index():
t=template(file='hello.tmpl',searchlist=)
print t
3)這時我們訪問http://localhost/index.ks/index
看看瀏覽器上顯示了什麼
下面我們來看乙個稍微複雜的例子:
contract list
my friends name
#for $listitem in $clist:
$listitem
#end for
2)在上面所提到目錄下面建立檔案index.ks,內容如下:
from cheetah.template import template
mylist=['chumpklutz','jacky yin','amy hu','jason zhang','bill cheng']
def index():
t=template(file='list.tmpl',searchlist=)
print t
3)這時我們訪問http://localhost/index.ks/index
看看瀏覽器上顯示了什麼
cheetah提供了很多的流程控制語句如while,break,continue,if等。在cheetah中還可以設定過濾器,可以使用臨時變數,還可以使用import語句匯入某個模組然後使用其中的類與方法就像標準的python指令碼一樣。更高階的特性請參見cheetah的官方**:http://www.cheetahtemplate.org/
在中使用SQLDMO
曾幾何時,夥伴們為的公升級傷透了腦筋.往往程式的公升級趕不上資料庫的公升級 版本控制的好,這也許不是什麼問題,但對於很大一部分中國公司來說這是無法避免的 而有些n久以前的資料庫要使用新程式的時候,資料庫的公升級簡直就是無從下手.所以對比資料庫公升級的緊要性就逐漸的凸現出來.對於表和字段的公升級按道理...
在ClanLib中使用blend func
本文是對blend func完全沒有認識的人寫的,就好象一天前的我一樣。廢話我就留到後面才說吧。在clanlib庫中的cl su ce與cl sprite中都會有 這個函式 void set blend func cl blendfunc src,cl blendfunc dest 其cl blen...
在MFC中使用Tab Control
說實話,我剛開始看見tab control的時候,覺得很簡單。哪知道用了一下,才發現自己錯了。要用好它,還是需要一些技巧的。經過網上搜尋資料,以及我自己的摸索,把一些要點記錄在這裡。tab control的執行效果有點像property sheet,但兩者還是有一些區別。我的理解就是property...