python - Jinja2 扩展输出转义的 html 而不是 html 标签

标签 python jinja2

我正在尝试写一个简单的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

在 flask 应用程序中使用它:

# register the extension in the app file
from flask import Flask
app = Flask(__name__)
app.jinja_env.add_extension('flask_meta.MetaExtension')

还有

<!-- 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;

我做错了什么?

最佳答案

这段代码产生...

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

试试这个...

from jinja2 import nodes
from flask import Flask
from jinja2.ext import Extension

app = Flask(__name__)

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="{0}" content="{1}" />'.format(args[0], args[1])

meta = MetaExtension


@app.route("/")
def index():
    #return 'hi'
    try:
        return MetaExtension._render('', ("this", 'that') , ("this2", 'that2') )
    except  Exception as e:
        print(str(e))

app.jinja_env.add_extension(meta)

if __name__ == "__main__":
    app.run()

希望这有帮助!

关于python - Jinja2 扩展输出转义的 html 而不是 html 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29370542/

相关文章:

python - 为什么我的计算域在反面不起作用?

python - 用本地目录覆盖 virtualenv 中的模块

python - 从模板进行查询

javascript - 如何根据我所在的页面将按钮标记为事件按钮?

javascript - Python Jinja2 从后端分配 javascript var

python - 有没有一种简单的方法可以将一个环境中的相同 Python 库安装到新的 Python 环境中?

python - 如何在 Python 中获取下个月的第一天?

python - 如果不同的变量是 True 或 False Python 3.3,则打印

html - 使用 Bootstrap 格式化 flask-wtf 提交按钮

python - Flask 路由顺序很重要吗?