Flask模板之测试器和环境对象

测试器: 在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

你可能感兴趣的:(Flask模板之测试器和环境对象)