python 模板语言

前言:公司之前的项目是用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

#end for
$author
#end if #slurp #set sep = '' #for $author in $authors ${sep}${author.person}#slurp #set sep = ', ' #end for

你可能感兴趣的:(python 模板语言)