允许 与谷歌App Engine和标签的Jinja2(Allowing
tags w

2019-06-24 03:35发布

在我的web应用程序,用户可以进行博客文章。 当我显示了博客文章,换行没有显示,因为我并没有更换新线, <br>标签。 问题是,我在金贾翻autoescaping,所以<br>标签逃脱。 我不希望暂时禁用autoescaping,我想特别允许<br>标签。 我会怎么做呢?

Answer 1:

我还有一个答案,我认为是最好的。 起初我只是展示我的变量post.content原样,而新行没有被保存下来。 解决方案在这里没有工作(井),和我的前解决方案只是权宜之计,并有重大问题。 这才是真正的解决方案:

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


Answer 2:

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

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

你也可以在设置autoescaping 环境给False



Answer 3:

在你的模型对象,增加这样的功能:

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>


Answer 4:

您可以创建一个过滤器的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}}


Answer 5:

下面是我自己写了一个过滤器:

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


Answer 6:

请注意,我都默认autoescape,所以我不要在此功能检查,但是这是我使用的是什么

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

那当然,

jinja_env.filters['nl2br'] = nl2br


Answer 7:

解决的办法是把<pre></pre>各地在那里我有内容的区域的标记。



Answer 8:

要做到这一点最简单的方法是逃避自己的字段,然后添加换行符。 当您在神社通过它,将其标记为安全所以它不是autoescaped。



文章来源: Allowing
tags with Google App Engine and Jinja2