【问题标题】:Jinja2 mark specific HTML tag as safeJinja2 将特定的 HTML 标记标记为安全
【发布时间】:2020-07-19 18:23:10
【问题描述】:

我知道 jinja 中的安全过滤器和逃生过滤器,但我找不到解决问题的方法。

我有以下字符串:

mystring = """<script>alert('I'm unsafe')</script>

I just entered a new line


Two new lines now!"""

我想在&lt;p&gt; 标记中使用它来正确显示换行符:

<p>{{mystring | replace('\n', '<br>')}}</p>

这不起作用,因为 Jinja2 会自动转义 HTML 标签,但如果我这样做:

<p>{{mystring | replace('\n', '<br>') | safe }}</p>

这样就不安全了。

我试过的是:

<p>{{mystring | escape | replace('\n', '<br>') | safe }}</p>

但上述不起作用,&lt;br&gt;s 仍因某种原因被转义

我怎样才能让&lt;br&gt;标签不被转义?

【问题讨论】:

    标签: python python-3.x flask jinja2


    【解决方案1】:

    要将&lt;br&gt;标记标记为安全,解决方案是使用自定义过滤器,如here所述

    这是一个小示例过滤器,它将文本分成 HTML 换行符和段落,并在启用自动转义时将返回值标记为安全的 HTML 字符串:

    通过一些自定义,您可以根据您的情况调整逻辑:

    创建filters.py(使应用程序模块化)

    import re
    from jinja2 import evalcontextfilter, Markup, escape
    
    _paragraph_re = re.compile(r'(\n)')
    
    @evalcontextfilter
    def nl2br(eval_ctx, value):
    
        result = ''.join('%s' % p.replace('\n', Markup('<br>'))
            for p in _paragraph_re.split(escape(value)))
    
        if eval_ctx.autoescape:
            result = Markup(result)
    
        return result
    

    然后在app.py

    from flask import Flask
    
    from .filters import nl2br
    
    app = Flask(__name__)
    [..]
    app.jinja_env.filters['nl2br'] = nl2br
    

    然后在你的模板中

    <p>{{ mystring | nl2br }}</p>
    
    

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2013-01-15
      • 2010-11-19
      • 2012-07-03
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多