测试器: 在Jinja2中,测试器是一些用来测试变量和表达式,返回布尔值(True或False)的特殊函数.
- 判断一个变量或者表达式是否是数字, 用is连接变量和测试器:
{% if age is number %}
{{ age * 365 }}
{% else %}
无效的数字
{% endif %}
- 内置测试器
1. callable(object) -- 判断对象是否可以被调用
2. defined(value) -- 判断变量是否已经定义
3. undefined(value) -- 判断变量是否未定义
4. none(value) -- 判断变量是否是None
5. number(value) -- 判断变量是否是数字
6. string(value) -- 判断变量是否是字符串
7. sequence(value) -- 判断变量是否是序列
8. iterable(value) -- 判断变量是否可以迭代
9. mapping(value) -- 判断变量是否是匹配对象,比如字典
10. sameas(value, other) 判断变量和other是否指向相同的内存地址
- 给测试器传递参数
is 的左侧是测试器的第一个参数,其他参数可以添加到括号传入,也可以在右侧使用空格连接.
{% if foo is sameas(bar) %}
等同于
{% if foo is sameas bar %}
- 自定义测试器
使用Flask提供的app.template_test(name)来注册一个测试器(name可以不传).
@app.template_test()
def baz(n):
if n = "baz::
return True
return False
模板环境对象
在Jinja2中,渲染行为有Jinja2.Environment类控制,所有的配置选项,上下文变量,全局函数,过滤器和测试器都存储在Environment实例上,当与Flask结合后,我们并不单独创建Environment对象,而是使用Flask创建的Environment对象,它存储在app.jinja_env属性上.
- 使用app.jinja_env更改jinja2的设置
app.jinja_env.variable_start_string = '[['
app.jinja_env.variable_end_string = ']]'
模板环境中的全局函数,过滤器,测试器分别存储在Environment对象的globals,filters和tests属性中,这3个属性都是字典对象.我们也可以直接操作这3个字典来添加相应的函数和变量,这通过向对应的字典添加一个键值对实现,传入模板的名称作为键,对应的函数对象或变量作为值.
- 添加自定义全局对象
def bar():
return "I am bar"
foo = "I am foo"
app.jinja_env.globals['bar'] = bar
app.jinja_env.globals['foo'] = foo
- 添加自定义过滤器
def smiling(s):
return s + ":)"
app.jinja_env.filters["smiling"] = smiling
- 添加自定义测试器
def baz(n):
if n == "baz"
return True
return False
app.jinja_env.tests["baz"] = baz