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
 <span class=keywords>$keywords</span>
#end if

循环

#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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容