如何在Jinja2(Flask)中注册自定义测试?

kra*_*r65 2 python jinja2 flask

在我正在使用Flask构建的网站中,我想测试变量是否为None.令我惊讶的是,这个简单的东西不起作用:

{% if my_var is not None %}
    {{ my_var }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

这引发了一个错误:TemplateAssertionError: no test named 'None'.所以按照这个例子,我写了一个简单的自定义测试:

def is_none(var):
    if var is None:
        return True
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

我想在Flask中注册如下:

from jinja2 import environment
environment.tests['None'] = is_none
Run Code Online (Sandbox Code Playgroud)

但这引发了一个错误说AttributeError: 'module' object has no attribute 'tests'.

有谁知道我在这里做错了什么?或者文档是完全错误的?欢迎所有提示!

[编辑]好的,我得到了更多.我现在用这个注册测试:

from jinja2 import Environment
environment = Environment()
environment.tests['None'] = is_none
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在我的模板中使用它时,我仍然得到错误说TemplateAssertionError: no test named 'None'.有任何想法吗?

nat*_*own 10

要注册自定义测试,请使用以下装饰器:

@app.template_test("none")
def is_none(obj):
    return obj is None
Run Code Online (Sandbox Code Playgroud)

然后你可以is_none用作测试:{% if my_var is none %}.正如dirn指出的那样,这复制了内置测试,但我想我会回答你原来的问题.

文档位于http://flask.pocoo.org/docs/latest/api/#flask.Flask.template_test


dir*_*irn 5

Jinja有一个内置的None被叫测试none.

{% if variable is none %}
    The variable is none. 
{% endif %}
Run Code Online (Sandbox Code Playgroud)