前言:公司之前的項(xiàng)目是用web.py開(kāi)發(fā)的,使用的模板也是自帶的Templetor模板。
參考 Python 模板引擎性能對(duì)比:
funcname: render_django used 0.071762
funcname: render_webpy used 0.015729
funcname: render_bottle used 0.008752
funcname: render_tornado used 0.005675
funcname: render_jinja2 used 0.002073
funcname: render_mako used 0.001627
funcname: render_cheetah used 0.000014
發(fā)現(xiàn)山外有山,于是此文對(duì)Django的DTL,web.py的Templetor及Cheetah進(jìn)行一個(gè)小的總結(jié)記錄。
Django的DTL
渲染方式:
render(*request*, *template_name*, *context*=*None*, *content_type*=*None*, *status*=*None*, *using*=*None*)
request: 是一個(gè)固定參數(shù), 沒(méi)什么好講的。
template_name: templates 中定義的文件, 要注意路徑名. 比 如'templates\polls\index.html', 參數(shù)就要寫(xiě)‘polls\index.html’
context: 要傳入文件中用于渲染呈現(xiàn)的數(shù)據(jù), 默認(rèn)是字典格式
content_type: 生成的文檔要使用的MIME 類(lèi)型。默認(rèn)為DEFAULT_CONTENT_TYPE 設(shè)置的值。
status: http的響應(yīng)代碼,默認(rèn)是200.
using: 用于加載模板使用的模板引擎的名稱(chēng)。
render(request, “user/index.html”, {})
通過(guò)給定的 context 對(duì)該模板進(jìn)行渲染
DTL
變量 {{ 變量 }},變量里面可以包含 .
標(biāo)簽{% 代碼塊 %}
過(guò)濾器 { { 變量|過(guò)濾器 }}
注釋{# 代碼塊或者h(yuǎn)tml都可以被注冊(cè) #}
變量 {{}}
如果變量中含有點(diǎn):則解析順序如下
如{{book.id}}:
1. 當(dāng)做一個(gè)字典處理
2. 屬性或者方法查詢(xún)(方法不用帶小括號(hào))
3. 當(dāng)做列表或者元組查詢(xún),把id當(dāng)做索引
4. 在模板中調(diào)用方法不能傳遞參數(shù),因?yàn)槟0謇锩娌荒軐?xiě)小括號(hào).
標(biāo)簽 {%%}
for標(biāo)簽
{ %for ... in ...%}
循環(huán)邏輯
{{forloop.counter}}表示當(dāng)前是第幾次循環(huán)
{ %empty%}
給出的列表為或列表不存在時(shí),執(zhí)行此處
{ %endfor%}
if標(biāo)簽
{ %if ...%}
邏輯1
{ %elif ...%}
邏輯2
{ %else%}
邏輯3
{ %endif%}
comment
過(guò)濾器 {{|}}
1. 語(yǔ)法:{ { 變量|過(guò)濾器 }},例如{ { name|lower }},表示將變量name的值變?yōu)樾?xiě)輸出
2. 使用管道符號(hào) (|)來(lái)應(yīng)用過(guò)濾器
3. 通過(guò)使用過(guò)濾器來(lái)改變變量的計(jì)算結(jié)果
4. 可以在if標(biāo)簽中使用過(guò)濾器結(jié)合運(yùn)算符
如:
{{if list1|length > 1}}
{{name|lower|upper}}
{{list|join:", "}}
Web.py的Templetor語(yǔ)言:
渲染方式:
在templates目錄里對(duì)應(yīng)模板例如hello.html文件的語(yǔ)句:
$def with (name)
Hello $name!
code.py:
render=web.template.render('templates')
code.py里面render要表示的的hello.html模板,hello的參數(shù)'world‘就是語(yǔ)言模板$def with (name)中定義的參數(shù)name的值。
模版功能大體分幾大類(lèi):$功能,$空格 功能,$冒號(hào) 功能,$def 模版功能,$code 純Python代碼塊功能,$var 屬性功能
$功能:標(biāo)簽&變量
就是$的后面跟的是一句python語(yǔ)句 行。例如一些控制語(yǔ)句,for,while。執(zhí)行某個(gè)函數(shù)等。
例如控制語(yǔ)句:http://webpy.org/docs/0.3/templetor#controlstructure,這里面的a.pop()可以理解為執(zhí)行某個(gè)函數(shù)。
$空格功能:
:如果$后面跟著一個(gè)空格,則表示定義一個(gè)新變量
例如:http://webpy.org/docs/0.3/templetor#assignments
這里面的get_bug(id)應(yīng)該是一個(gè)函數(shù),函數(shù)計(jì)算結(jié)果返回給一個(gè)新變量。
$冒號(hào)功能:
如果$后面跟著一個(gè)冒號(hào):,則表示冒號(hào)后的對(duì)象以Html形式顯示。否則就會(huì)是一些對(duì)應(yīng)的字符串。這個(gè)功能可以對(duì)應(yīng)為php中的include功能。但是webpy為了安全,不支持html中直接import,而是借助于$def with帶入。
$def 功能:
這個(gè)可以理解成一個(gè)模版,即Html 語(yǔ)法塊,語(yǔ)法塊中支持$功能和標(biāo)準(zhǔn)Html語(yǔ)法。
$code 功能:
這個(gè)是純Python代碼,即可以在Html中寫(xiě)python代碼,但是這個(gè)代碼不能帶Html語(yǔ)法,只能是純粹的python代碼。
$var功能:
這個(gè)可以為當(dāng)前的渲染頁(yè)面對(duì)象提供一個(gè)額外的屬性。
所以根據(jù)以上性質(zhì),我們?cè)趙ebpy的html中若有以下需求:
1,引用某個(gè)個(gè)變量,def函數(shù),或者一個(gè)class類(lèi)。
可以使用$功能,此功能可以像python函數(shù)一樣執(zhí)行,你可以在后臺(tái)應(yīng)用程序py文件中定義好這個(gè)方法、類(lèi)或者變量。甚至在html代碼中直接用$code去寫(xiě)
2,如果你想類(lèi)似于c,c++,php風(fēng)格的include。
你可以在Html代碼中生成一個(gè)$def 模版,或者在后臺(tái)應(yīng)用程序py文件中定義另一個(gè)html的render對(duì)象,然后作為參數(shù)傳入。
3,如果你想使用python的函數(shù)
如果是內(nèi)建的函數(shù),例如string里面的upper(),可以在html代碼中直接使用。例如$ 'test'.upper()
如果是需要import的,則變?yōu)間lobal類(lèi)型,例如http://webpy.org/docs/0.3/templetor#builtins
這樣在html代碼中也可以直接使用。比如生成一個(gè)日期。
Cheetah模板語(yǔ)言:
渲染方式:
Template( file=”文件路徑”, searchList=[{'user' : User,
'order' : Order}])
變量 $
我的名字叫 $name
$staff.address.roadname
如果混合...
他是個(gè)${desease}患者.
兩個(gè)變量在一起也可以.
$foo$bar
標(biāo)簽 ' #'
if判斷
#if $keywords
$keywords
#else
There are no keywords!
#end if
else是可選的:
#if $keywords
<span class=keywords>$keywords</span>
#end if
循環(huán)
#for $author in $authors
$author.person.fullName
#end for
文件包含
$name
<p> $content
#include "authors.html"
嵌套
#if $authors
<table class=Author>
#for $author in $authors
<tr class=Author> <td class=Author>
$author
</td> </tr>
#end for
</table>
#end if
#slurp
#set sep = ''
#for $author in $authors
${sep}${author.person}#slurp
#set sep = ', '
#end for