如何访问jinja2.Template的环境

时间:2018-08-23 14:35:48

标签: python jinja2

定义包括加载程序的环境时,很容易添加自定义过滤器:

from jinja2 import Environment, PackageLoader, select_autoescape
env = Environment(
    loader=PackageLoader('tests', 'templates'),
    autoescape=select_autoescape(['html', 'xml'])
)
env.filters['rsttable'] = rsttable

但是我很难将自定义过滤器添加到创建Template()构造函数的模板中:

from jinja2 import Template

def highlight(txt):
    return '**%s**' % txt

tpl = Template('hello {{name | highlight}}')
tpl.render(name='me')

产量:

TemplateAssertionError: no filter named 'highlight'

Jinja2 doc对我来说很隐秘:

  

从构造函数而非模板创建的模板对象   环境确实具有指向   可能与其他模板共享的临时环境   使用构造函数和兼容设置创建。

1 个答案:

答案 0 :(得分:1)

如果您的模板是内联字符串(例如您的示例),请使用Environment.from_string()来获取模板。 (如果是文件,请使用.get_template()。)

通过这种方式,可以将过滤器注册到环境中。

from jinja2 import Environment, PackageLoader, select_autoescape

env = Environment(
    loader=PackageLoader("tests", "templates"),
    autoescape=select_autoescape(["html", "xml"]),
)


def highlight(txt):
    return "**%s**" % txt


env.filters["highlight"] = highlight


tpl = env.from_string("hello {{name | highlight}}")
tpl.render(name="me")