前言:公司之前的项目是用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()
如果是需要import的,则变为global类型,例如http://webpy.org/docs/0.3/templetor#builtins
这样在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