Python 如何在带有参数的块上使用Jinja2过滤器

Python 如何在带有参数的块上使用Jinja2过滤器,python,jinja2,Python,Jinja2,我正在尝试使用jinja2模板。我有一个名为highlight的自定义过滤器,它接受字符串和语言名称,并将它们传递给pyhments,以获得代码highlightning。我试着这样使用它: {% filter highlight("python") %} import sys def main(): pass {% endfilter %} 但我得到了这个错误: AttributeError: 'str' object has no attribute 'get_tokens'

我正在尝试使用
jinja2
模板。我有一个名为
highlight
的自定义过滤器,它接受字符串和语言名称,并将它们传递给
pyhments
,以获得代码highlightning。我试着这样使用它:

{% filter highlight("python") %}
import sys

def main():
    pass
{% endfilter %}
但我得到了这个错误:

AttributeError: 'str' object has no attribute 'get_tokens'
然后我试了一下:

{% filter highlight "python" %}
它也不起作用

可能有一个技巧是通过,然后通过
{{…}}
将其粘贴回来,但是这种技术还没有融入到主源代码中,对我来说似乎太黑客了

那么,这在目前是可能的,还是我只是做错了

编辑:以下是过滤器:

@jinja2.contextfilter
def highlight(context, code, lang):
    print("HIGHLIGHT")
    print(code)
    return jinja2.Markup(pygments.highlight(code, lexer=lang, formatter='html'))

我是个白痴,那是
pygments
错误。由于一些错误,我没有看到stacktrace中的最后一个条目是从那里来的

你应使用:

pygments.highlight(
    code, 
    lexer=pygments.lexers.get_lexer_by_name(lang), 
    formatter=pygments.formatters.get_formatter_by_name('html')
)
而不是:

pygments.highlight(code, lexer=lang, formatter='html')

您可以显示自定义的
突出显示
过滤器的定义吗?@hjpotter92添加到帖子中。它在
jinja2
中的哪一行显示了错误?@hjpotter92(最后一个跟踪条目在lexer中,第374行),或者如果您询问源模板,在第一行本身(
{%filter…
)。