python信息技术实践之八Jinja模板技术
概要
模板仅仅是文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV、LaTex 等等)。 它并没有特定的扩展名, .html 或 .xml 都是可以的。
模板包含 变量 或 表达式 ,这两者在模板求值的时候会被替换为值。模板中 还有标签,控制模板的逻辑。模板语法的大量灵感来自于 Django 和 Python 。
Flask可以与模板引擎一起使用,如Jinja2。这使得你可以创建动态的HTML页面。
from flask import render_template
@app.route('/about')
def about():
return render_template('about.html')
在这个例子中,render_template
函数用于渲染about.html
模板文件。
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:
特性: - 沙箱中执行 - 强大的 HTML 自动转义系统保护系统免受 XSS - 模板继承 - 及时编译最优的 python 代码 - 可选提前编译模板的时间 - 易于调试。异常的行数直接指向模板中的对应行。 - 可配置的语法
Jinja的速度怎么样?
和Mako差不多,但比Genshi以及Django的模板引擎快10~20倍。
把逻辑判断(Logic)放到模板里是个好主意吗?
毫无疑问,你放到模板里逻辑判断(Logic)应该越少越好。但为了让大家都开心,适当的逻辑判断是需要的。尽管如此,它有很多对于你能做什么,不能做什么的限制。
出于诸多考虑(速度,易读性等等),Jinja既不允许你放置任意的Python代码,也不允许所有的Python表达式。这也是为什么我们要了解Jinja2的语法。
什么是模版引擎
在Python中,什么是模版?就是在一个静态HTML加入一些类似变量的标签,然后引擎在渲染这个HTML时候会动态的把变量填入内容,生成一个最终的HTML。 什么是模版引擎?其实就是一种能解析类似Python语言
的标记语言的解释器。
比如我们在HTML模版中输入一个`<p> {{ post.title }} </p>`,显然这不是真正的HTML语法。但是当Jinja2解释器读取到`{{ ...}}`后知道里面是一个变量,那么就把这个变量替换为真正的值,最后翻译出来就变成了`<p> 大标题 </p>`这样的HTML内容。
Jinja2是一个模版语言,只是类似Python,比较符合Python语法,但不完全相同!
所有的模版引擎,实际上都差不多,不管是基于VBS语言的ASP模版,还是基于PHP语言的PHP模版,都不是与原本语言一摸一样,而只是做到尽量一样而已。
Jinja2语言基础
注意:Jinja2
模版语言,是不区分缩进的,和纯python不同。实际上所有模版语言都不区分缩紧。
常用标记:
注释:`{# 这是注释 #}`
变量:`{{ post.title }}`,或字典元素`{{your_dict['key']}}`,或列表`{{your_list[0]}}`
多行代码块:`{% 开始 %} HTML标签 {% 结束 %}`
示例:
{% if user %}
{{ user }}
{% else %}
hello!
{% for index in indexs %}
{{ index }}
{% endfor %}
Delimiters(分隔符)
{% … %} 语句([Statements](http://jinja.pocoo.org/docs/dev/templates/#list-of-control-structures))
{{ … }} 打印模板输出的表达式([Expressions](http://jinja.pocoo.org/docs/dev/templates/#expressions))
{# … #} 注释
# … ## 行语句([Line Statements](http://jinja.pocoo.org/docs/dev/templates/#line-statements))
Variables(变量)
除了普通的字符串变量,Jinja2还支持列表、字典和对象,你可以这样获取变量值:
{{ mydict['key'] }}
{{ mylist[3] }}
{{ mylist[myintvar] }}
{{ myobj.somemethod() }}
获取一个变量的属性有两种方式:
{{ foo.bar }}
{{ foo['bar'] }}
这两种方法基本相同(深层次的区别可以暂不考虑)
Filter 过滤器()
一个filter过滤器的本质就是一个function函数。使用格式为:变量名 | 函数
。 它做到的就是,把变量传给函数,然后再把函数返回值作为这个代码块的值。
如:
<!-- 带参数的 -->
{{变量 | 函数名(*args)}}
<!-- 不带参数可以省略括号 -->
{{变量 | 函数名}}
链式调用(管道式): 和命令行的pipline管道一样,可以一次调用多个函数(过滤器),如:
{{ "hello world" | reverse | upper }}
文本块调用(将中间的所有文字都作为变量内容传入到过滤器中):
{% filter upper %}
一大堆文字
{% endfilter %}
Jinja2常用过滤器
字符串操作:
safe:禁用转义
<p>{{ '<em>hello</em>' | safe }}</p>
capitalize:把变量值的首字母转成大写,其余字母转小写
<p>{{ 'hello' | capitalize }}</p>
lower:把值转成小写
<p>{{ 'HELLO' | lower }}</p>
upper:把值转成大写
<p>{{ 'hello' | upper }}</p>
title:把值中的每个单词的首字母都转成大写
<p>{{ 'hello' | title }}</p>
reverse:字符串反转
<p>{{ 'olleh' | reverse }}</p>
format:格式化输出
<p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML标签都删掉
<p>{{ '<em>hello</em>' | striptags }}</p>
truncate: 字符串截断
<p>{{ 'hello every one' | truncate(9)}}</p>
列表操作:
first:取第一个元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
last:取最后一个元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
length:获取列表长度
<p>{{ [1,2,3,4,5,6] | length }}</p>
sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>
Tests(测试,判断)
Jinja2提供的tests可以用来在语句里对变量或表达式进行测试,如果要测试一个变量,可以在变量后加上“is”和test名,比如:
{% if user.age is equalto 42 %} {# 这里也可以写成... is equalto(42) #}
Ha, you are 42!
{% endif %}
如果要传入参数,可以在test后增加括号,也可以直接写在后面。
循环控制
如果应用启用来 循环控制 ,则可以在循环中使用 break 和 continue 。到达 break 时,循环终止。到达 continue 时,当前处理会终止并 从下一次迭代继续。
这个循环每两项跳过一次:
{% for user in users %}
{%- if loop.index is even %}{% continue %}{% endif %}
...
{% endfor %}
同样,这个循环 10 次迭代之后会终止处理:
{% for user in users %}
{%- if loop.index >= 10 %}{% break %}{% endif %}
{%- endfor %}
With 语句
New in version 2.3.
如果应用启用了 With 语句 ,将允许在模板中使用 with 关键 字。这使得创建一个新的内作用域。这个作用域中的变量在外部是不可见的。
With 用法简介:
{% with %}
{% set foo = 42 %}
{{ foo }} foo is 42 here
{% endwith %}
foo is not visible here any longer
因为在作用域的开始设置变量很常见,你可以在 with 语句里这么做。下面的两 个例子是等价的:
{% with foo = 42 %}
{{ foo }}
{% endwith %}
{% with %}
{% set foo = 42 %}
{{ foo }}
{% endwith %}
自动转义扩展
New in version 2.4.
如果你的应用程序设置了 自动转义扩展 ,你就可以在模版中开启或者关闭自动转义。
例子:
{% autoescape true %}
自动转义在这块文本中是开启的。
{% endautoescape %}
{% autoescape false %}
自动转义在这块文本中是关闭的。
{% endautoescape %}
在 endautoescape 标签之后,自动转义的行为将回到与之前相同的状态。
- 点赞
- 收藏
- 关注作者
评论(0)