前言:公司之前的项目是用web.py开发的,使用的模板也是自带的Templetor模板。

参考Python 模板引擎性能对比:

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

发现山外有山,于是此文对Django的DTL,web.py的Templetor及Cheetah进行一个小的总结记录。

Django的DTL

渲染方式:

render(*request*, *template_name*, *context*=*None*, *content_type*=*None*, *status*=*None*, *using*=*None*)
request: 是一个固定参数, 没什么好讲的。

template_name: templates 中定义的文件, 要注意路径名. 比 如'templates\polls\index.html', 参数就要写‘polls\index.html’

context: 要传入文件中用于渲染呈现的数据, 默认是字典格式

content_type: 生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

status: http的响应代码,默认是200.

using: 用于加载模板使用的模板引擎的名称。

render(request, “user/index.html”, {})

通过给定的 context 对该模板进行渲染

DTL

变量 {{ 变量 }},变量里面可以包含 .

标签{% 代码块 %}

过滤器 { { 变量|过滤器 }}

注释{# 代码块或者html都可以被注册 #}

变量 {{}}

如果变量中含有点:则解析顺序如下

如{{book.id}}:

1. 当做一个字典处理

2. 属性或者方法查询(方法不用带小括号)

3. 当做列表或者元组查询,把id当做索引

4. 在模板中调用方法不能传递参数,因为模板里面不能写小括号.

标签 {%%}
for标签
{ %for ... in ...%}
循环逻辑
{{forloop.counter}}表示当前是第几次循环
{ %empty%}
给出的列表为或列表不存在时,执行此处
{ %endfor%}
if标签
{ %if ...%}
逻辑1
{ %elif ...%}
逻辑2
{ %else%}
逻辑3
{ %endif%}
comment

过滤器 {{|}}

1. 语法:{ { 变量|过滤器 }},例如{ { name|lower }},表示将变量name的值变为小写输出

2. 使用管道符号 (|)来应用过滤器

3. 通过使用过滤器来改变变量的计算结果

4. 可以在if标签中使用过滤器结合运算符

如:

{{if list1|length > 1}}
{{name|lower|upper}}
{{list|join:", "}}

Web.py的Templetor语言:

渲染方式:

在templates目录里对应模板例如hello.html文件的语句:

$def with (name)
Hello $name!
code.py:
render=web.template.render('templates')

code.py里面render要表示的的hello.html模板,hello的参数'world‘就是语言模板$def with (name)中定义的参数name的值。

模版功能大体分几大类:$功能,$空格 功能,$冒号 功能,$def 模版功能,$code 纯Python代码块功能,$var 属性功能

$功能:标签&变量

就是$的后面跟的是一句python语句 行。例如一些控制语句,for,while。执行某个函数等。

例如控制语句:http://webpy.org/docs/0.3/templetor#controlstructure,这里面的a.pop()可以理解为执行某个函数。

$空格功能:

:如果$后面跟着一个空格,则表示定义一个新变量

例如:http://webpy.org/docs/0.3/templetor#assignments

这里面的get_bug(id)应该是一个函数,函数计算结果返回给一个新变量。

$冒号功能:

如果$后面跟着一个冒号:,则表示冒号后的对象以Html形式显示。否则就会是一些对应的字符串。这个功能可以对应为php中的include功能。但是webpy为了安全,不支持html中直接import,而是借助于$def with带入。

$def 功能:

这个可以理解成一个模版,即Html 语法块,语法块中支持$功能和标准Html语法。

$code 功能:

这个是纯Python代码,即可以在Html中写python代码,但是这个代码不能带Html语法,只能是纯粹的python代码。

$var功能:

这个可以为当前的渲染页面对象提供一个额外的属性。

所以根据以上性质,我们在webpy的html中若有以下需求:

1,引用某个个变量,def函数,或者一个class类。

可以使用$功能,此功能可以像python函数一样执行,你可以在后台应用程序py文件中定义好这个方法、类或者变量。甚至在html代码中直接用$code去写

2,如果你想类似于c,c++,php风格的include。

你可以在Html代码中生成一个$def 模版,或者在后台应用程序py文件中定义另一个html的render对象,然后作为参数传入。

3,如果你想使用python的函数

如果是内建的函数,例如string里面的upper(),可以在html代码中直接使用。例如$ 'test'.upper()

这样在html代码中也可以直接使用。比如生成一个日期。

Cheetah模板语言:

渲染方式:

Template( file=”文件路径”, searchList=[{'user' : User,
'order' : Order}])
变量 $
我的名字叫 $name
$staff.address.roadname
如果混合...
他是个${desease}患者.
两个变量在一起也可以.
$foo$bar
标签 ' #'
if判断
#if $keywords
$keywords
#else
There are no keywords!
#end if
else是可选的:
#if $keywords
$keywords
#end if
循环
#for $author in $authors
$author.person.fullName
#end for
文件包含
$name
 $content
#include "authors.html"
嵌套
#if $authors
#for $author in $authors
$author
#end for
#end if
#slurp
#set sep = ''
#for $author in $authors
${sep}${author.person}#slurp
#set sep = ', '
#end for