Jinja是组成Flask的模板引擎。可能你还不太了解它是干嘛的,但你对下面这些百分号和大括号肯定不陌生:
{% block body %} <ul> {% for user in users %} <li><a href="{{ user.url }}" rel="external nofollow" >{{ user.username }}</a></li> {% endfor %} </ul> {% endblock %}
看过《Flask Web开发》,很多人都能写出来这些,但除了书里讲的,你还应该了解一些其他的语法细节。这篇文章就来介绍一些常用的语法和函数,如果想要系统完整的了解Jinja,可以去读它的文档:Jinja2 Documentation。
FAQ
在Jinja网站上的FAQ里,我挑了三个大家可能会比较感兴趣的问题(简单翻译了一下)。
1、为什么要叫Jinja?
之所以叫Jinja,是因为日本的神社(Jinja)英文单词是temple,而模板的英文是template,两者发音很相似(这么说来,它本来也有可能叫Miao的……)。
2、Jinja的速度怎么样?
和Mako差不多,但比Genshi以及Django的模板引擎快10~20倍。
3、把逻辑判断(Logic)放到模板里是个好主意吗?
毫无疑问,你放到模板里逻辑判断(Logic)应该越少越好。但为了让大家都开心,适当的逻辑判断是需要的。尽管如此,它有很多对于你能做什么,不能做什么的限制。
出于诸多考虑(速度,易读性等等),Jinja既不允许你放置任意的Python代码,也不允许所有的Pyth本文来源gaodaimacom搞#^代%!码&网*on表达式。这也是为什么我们要了解Jinja2的语法。
Delimiters(分隔符)
{% … %} 语句(Statements)
{{ … }} 打印模板输出的表达式(Expressions)
{# … #} 注释
# … ## 行语句(Line Statements)
多说一下注释,这是单行注释:
{#% for user in users %#}
下面是多行注释:
{# note: commented-out template because we no longer use this {% for user in users %} ... {% endfor %} #}
Variables(变量)
除了普通的字符串变量,Jinja2还支持列表、字典和对象,你可以这样获取变量值:
{{ mydict['key'] }} {{ mylist[3] }} {{ mylist[myintvar] }} {{ myobj.somemethod() }}
获取一个变量的属性有两种方式:
{{ foo.bar }} {{ foo['bar'] }}
这两种方法基本相同(深层次的区别可以暂不考虑)
Filter(过滤器)
过滤器用来修改变量,使用一个竖线和变量相隔。
{{ items|join(', ') }}
常用的内置过滤器:
- safe 渲染时不转义
- capitalize 首字母大写
- lower 小写
- upper 大写
- title 每个单词的首字母都转换成大写
- trim 去掉首尾空格
- striptags 去掉值里的HTML标签
- default 设置一个默认值,如果变量未定义,就用这个默认值替换。类似这样:
{{ my_variable|default('my_variable is not defined') }}
- random(seq) 返回一个序列里的随机元素
- truncate(s, length=255, killwords=False, end=’…’) 截取出指定长度的文章(文章摘要)
- format(value, *args, **kwargs) 参考Python的字符串格式化函数
- length 左边如果是列表,输出列表的数量;如果是字符串,则输出字符串的长度
- ……