如何用可变参数编写一个简单的扩展名?

时间:2016-08-23 09:17:51

标签: python jinja2 template-engine

我想实现一个带的自定义扩展,允许动态加载外部数据源。例如:

{# A jinja template #}
{% datasource '../foo.yml' %}

{{ foo }}
{{ bar }}

所以我写了这个:

#!/usr/bin/env python
from jinja2 import Template, nodes
from jinja2.ext import Extension

class Test(Extension):
    tags = set(['datasource'])

    def parse(self, parser):
        lineno = next(parser.stream).lineno
        args = [parser.parse_expression()]
        call = self.call_method('_render', args)
        return nodes.Output([call], lineno=lineno)

    def _render(self, name):
        print name
        print "Hello from render"
        return None

x = """
{# A jinja template #}
{% datasource '../foo.yml' %}

{{ foo }}
{{ bar }}
"""

t = Template(x, extensions=[Test])
t.render()

如果我使用它,效果很好:

{% datasource '../foo.yml' %}

但是如果我错过了'../foo.yml'这个论点,我会得到一个很难理解的长篇追溯:

TemplateSyntaxError: unexpected 'end of statement block'

如果我添加第二个参数,我也会收到错误:

{% datasource 'foo', 'bar' %}

TemplateSyntaxError: expected token 'end of statement block', got ','

我该如何实现?

奖金问题:lineno=lineno是否必要?

0 个答案:

没有答案