【问题标题】:Allowing <br> tags with Google App Engine and Jinja2使用 Google App Engine 和 Jinja2 允许 <br> 标签
【发布时间】:2012-05-13 06:25:44
【问题描述】:

在我的网络应用中,用户可以发表博客文章。当我显示博客文章时,没有显示换行符,因为我没有用 &lt;br&gt; 标记替换新行。问题是我在 Jinja 中打开了自动转义,所以 &lt;br&gt; 标签被转义了。我不想暂时禁用自动转义,我想专门允许&lt;br&gt; 标签。我该怎么做?

【问题讨论】:

  • 如果您想尊重换行符,可以使用textarea

标签: python escaping whitespace jinja2 webapp2


【解决方案1】:

请注意,我默认启用了自动转义,所以我没有在这个函数中检查它,但这就是我正在使用的

def nl2br(value): 
  split = value.split('\n')
  return jinja2.Markup('<br>').join(split)

当然,

jinja_env.filters['nl2br'] = nl2br

【讨论】:

    【解决方案2】:

    这是我自己写的过滤器:

    import jinja2
    
    @jinja2.evalcontextfilter
    def nl2br(eval_ctx, value):
        result = jinja2.escape(value).unescape().replace('\n', '<br>')
        if eval_ctx.autoescape:
            result = jinja2.Markup(result)
        return result
    

    并通过调用将过滤器添加到jinja2.Environment()

    jinja_env.filters['nl2br'] = nl2br
    

    【讨论】:

    • 请注意,这是不安全的,因为它会传递 HTML 内容。应该是:result = escape(value).replace("\n", Markup("
      "))
    【解决方案3】:

    您可以创建一个 jinja2 过滤器:

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

    您需要先将过滤器添加到您的 jinja2 环境中,然后才能使用它:

    JINJA2_ENV.filters['nl2br'] = jinja2_filters.nl2br
    

    在您的模板中,您可以使用该过滤器:

    {{post.content|nl2br}}
    

    【讨论】:

      【解决方案4】:

      我有另一个我认为最好的答案。最初我只是按原样显示我的变量post.content,并且没有保留换行符。这里的解决方案都不起作用(很好),我的预解决方案只是一个快速修复并且存在重大问题。这是真正的解决方案:

      {% for line in post.content.splitlines() %}
          {{line}}<br>
      {% endfor %}
      

      【讨论】:

        【解决方案5】:

        在您的模型对象中,添加如下函数:

        class Post(db.Model):
            # ...
        
            def html_content(self):
                # Escape, then convert newlines to br tags, then wrap with Markup object
                # so that the <br> tags don't get escaped.
                def escape(s):
                    # unicode() forces the conversion to happen immediately,
                    # instead of at substitution time (else <br> would get escaped too)
                    return unicode(jinja2.escape(s))
                return jinja2.Markup(escape(self.content).replace('\n', '<br>'))
        

        然后在你的模板中,调用它:

        <p>{{ post.html_content() }}</p>
        

        【讨论】:

          【解决方案6】:

          您可以使用|safe 过滤器,或使用autoescape 块:

          {% autoescape false %}
          {{ content goes here }}
          {% autoescape %}
          

          您还可以在environment 中设置自动转义到False

          【讨论】:

          • 但如果不安全怎么办?
          • @LtWorf 是对的。您应该假设用户输入的内容是恶意的。大部分不会,但你不希望那个邪恶的家伙插入 JavaScript 给你的用户带来病毒。 -1
          【解决方案7】:

          最简单的方法是自己转义该字段,然后添加换行符。当你在 jinja 中传递它时,将其标记为安全,这样它就不会自动转义。

          【讨论】:

            【解决方案8】:

            解决方案是在我拥有内容的区域周围放置&lt;pre&gt;&lt;/pre&gt; 标签。

            【讨论】:

            • 这不是一个很好的解决方案 - pre 对其他事情有影响,比如换行。
            猜你喜欢
            • 1970-01-01
            • 2012-06-06
            • 2011-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-20
            • 2015-12-11
            相关资源
            最近更新 更多