Jinja2扩展输出转义了html而不是html标记

2024-10-03 19:31:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个简单的jinja2扩展,它将在页面中呈现一个带有一些属性和内容属性的<meta>标记。看起来像这样:

from jinja2 import nodes
from jinja2.ext import Extension

class MetaExtension(Extension):
    """
    returns a meta tag of key, value
    >> env = jinja2.Environment(extensions=[MetaExtension])
    >> env.from_string('{% meta "key", "value" %}').render()
       u'<meta property="keyword" content="value" />'
   """

    # we'll use it in the template with
    tags = set(['meta'])

    def __init__(self, environment):
        super(MetaExtension, self).__init__(environment)

    def parse(self, parser):
        tag = parser.stream.next()
        args = [parser.parse_expression()]

        if parser.stream.skip_if('comma'):
            args.append(parser.parse_expression())

        return nodes.Output([self.call_method('_render', args)]).set_lineno(tag.lineno)

    def _render(self, *args):
        return '<meta property="{}" content="{}" />'.format(args[0], args[1])

meta = MetaExtension

在烧瓶应用程序中使用:

^{pr2}$

以及

<!-- use it in the template -->
<head>
  {% meta "key", "value" %}
</head>

虽然标记在控制台中呈现得很好,但是当我在flask应用程序中使用它时,它会跳过html并将转义的标记输出到页面。所以,不是

<meta property="keyword" content="value" />

我明白了

&lt;meta property=&#34;key&#34; content=&#34;value&#34; /&gt;

我做错什么了?谢谢。在

更新:请看下面我的答案


Tags: keyfrom标记selfparserjinja2valuedef
2条回答

原来我应该用nodes.CallBlock而不是nodes.Output。应用该更改,parse_render函数如下所示:

...
def parse(self, parser):
    tag = parser.stream.next()
    args = [parser.parse_expression()]

    if parser.stream.skip_if('comma'):
        args.append(parser.parse_expression())

    return nodes.CallBlock(self.call_method('_render', args),
            [], [], []).set_lineno(tag.lineno)

def _render(self, value, name, *args, **kwargs):
    return '<meta property="{}" content="{}" />'.format(value, name)

希望这对某些人有所帮助,因为Jinja2扩展引用(尤其是对于非块标记)不容易获得:)

这段代码产生。。。在

<meta property="('this', 'that')" content="('this2', 'that2')" />

试试这个。。。在

^{pr2}$

希望这有帮助!在

相关问题 更多 >