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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Jinja2模板引擎简介 模板 在前面的实例中,视图函数的主要作用是生成请求的响应,这是最简单请求.实际上,视图函...
    懵懂_傻孩纸阅读 14,431评论 0 7
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,215评论 22 257
  • 介绍 Jinja是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker...
    ZhouLang阅读 7,972评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,869评论 18 139
  • #微写作#第33篇 上篇文章说到,我是一个喜欢问为什么的人,我不愿意接受别人提供的现成答案,而一定要刨根问底,从本...
    SusanKuang阅读 1,241评论 5 3