Jinja2模板小记

##初识 前些日子看Flask,发现它用的模板是Jinja2,一时兴起,便翻起文档看了起来,发现语法和众多模板差不多,当然我只是粗略的玩了一下,发现Jinja的名字是源于Jinja是日本寺庙的名称, Jinja2Mako的性能相近,比Django的模板引擎或Genshi快10到20倍,因为项目中尚未用到,所以也没有深入研究,现在粗浅的介绍下我所了解的。

特性:

##安装

首先自然是安装咯,一般都有两种安装方法,

####直接通过easy_install或者pip安装:

1
2
easy_install Jinja2
pip install Jinja2

####源码安装:

1
git clone https://github.com/mitsuhiko/jinja2.git
1
ln -s jinja2 /usr/lib/python2.X/site-packages

####通过tar包安装

##“Hello World”

现在安装完毕,那么先通过简单的Hello,World来使用下Jinja2吧,创建一个模板,然后渲染它,使它出现“Hello,World”。

1
2
3
4
>>> from jinja2 import Template
>>> template = Template('Hello !')
>>> template.render(name='World')
u'Hello World!'

##基本原理

Jinja2使用一个名为Environment的中心对象。这个类的实例用于存储配置、全局对象,并用于从文件系统或其它位置加载模板。即使你通过:class:Template类的构造函数用字符串创建模板,也会为你自动创建一个环境,尽管是共享的。

大多数应用在应用初始化时创建一个Environment对象,并用它加载模板。在某些情况下,如果使用多份配置,使用并列的多个环境无论如何是有用的。

配置 Jinja2 为你的应用加载文档的最简单方式看起来大概是这样:

1
2
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))

这会创建一个默认设定下的模板环境和一个在yourapplication python包中的templates文件夹中寻找模板的加载器。多个加载器是可用的,如果你需要从数据库或其它资源加载模板,你也可以自己写一个。

你只需要调用get_template()方法从这个环境中加载模板,并会返回已加载的Template:

1
template = env.get_template('mytemplate.html')

用若干变量来渲染它,调用render()方法:

1
print template.render(the='variables', go='here')

使用一个模板加载器,而不是向TemplateEnvironment.from_string()传递字符串,有许多好处。除了使用上便利,也使得模板继承成为可能。

##基本语法

####{\% … \%} 和 {{ … }}

前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。

####变量

你可以使用点.来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法[]。下面的几行效果是一样的:

1

花括号 不是 变量的一部分,而是打印语句的一部分是重要的。如果你访问标签 里的不带括号的变量。如果变量或属性不存在,会返回一个未定义值。你可以对这类值做什么取决于应用的配 置,默认的行为是它如果被打印,其求值为一个空字符串,并且你可以迭代它,但其它 操作会失败。

####过滤器

过滤器与变量用管道符号|分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。

1

####判断语句

判断一个变量或表达式,你要在变量后加上一个is以及要判断的名称。例如,要得出一个值是否定义过,你可以用 name is defined,这会根据name是否定义返回 true 或 false 。

栗子:

1
2
\{\% if loop.index is divisibleby 3 \%\}
\{\% if loop.index is divisibleby(3) \%\}

####注释

要把模板中一行的部分注释掉,默认使用{# ... #}注释语法。这在调试或 添加给你自己或其它模板设计者的信息时是有用的。

##其它模板

未完待续…

##参考

  • http://docs.jinkan.org/docs/jinja2/index.html
  • http://www.oschina.net/question/5189_3943