我想实现一个带jinja2的自定义扩展,允许动态加载外部数据源。例如:
{# 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
是否必要?