Allowing
tags with Google App Engine and Jinj

2019-02-12 16:57发布

In my web app, the user can make blog posts. When I display the blog post, newlines aren't shown because I didn't replace the new lines with <br> tags. The problem is that I've turned autoescaping on in Jinja, so <br> tags are escaped. I don't want to temporarily disable autoescaping, I want to specifically allow <br> tags. How would I do this?

8条回答
我想做一个坏孩纸
2楼-- · 2019-02-12 17:07

Note that i have autoescape on by default, so I don't check it in this function, but this is what I'm using

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

then of course,

jinja_env.filters['nl2br'] = nl2br
查看更多
乱世女痞
3楼-- · 2019-02-12 17:10

The easiest way to do this is to escape the field yourself, then add line breaks. When you pass it in in jinja, mark it as safe so it's not autoescaped.

查看更多
走好不送
4楼-- · 2019-02-12 17:12

I have another answer that I think is the best. Initially I was just displaying my variable post.content as-is, and the newlines weren't being preserved. None of the solutions here worked (well), and my pre solution was just a quick fix and had major issues. This is the real solution:

{% for line in post.content.splitlines() %}
    {{line}}<br>
{% endfor %}
查看更多
Anthone
5楼-- · 2019-02-12 17:24

The solution was to put <pre></pre> tags around the area where I had the content.

查看更多
该账号已被封号
6楼-- · 2019-02-12 17:25

You can use the |safe filter, or use the autoescape blocks:

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

You could also set autoescaping in the environment to False.

查看更多
放我归山
7楼-- · 2019-02-12 17:26

In your model object, add a function like this:

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>'))

Then in your template, just call that:

<p>{{ post.html_content() }}</p>
查看更多
登录 后发表回答