2012-05-03 9 views
9

En mi aplicación web, el usuario puede hacer publicaciones en el blog. Cuando visualizo la publicación del blog, no se muestran nuevas líneas porque no reemplacé las nuevas líneas con etiquetas <br>. El problema es que he activado el autoescaping en Jinja, así que las etiquetas <br> se han escapado. No deseo desactivar temporalmente el autoescaping, quiero permitir específicamente las etiquetas <br>. ¿Cómo haría esto?Permitir etiquetas <br> con Google App Engine y Jinja2

+0

Puede usar un 'textarea' si desea que se respeten las nuevas líneas. – bossylobster

Respuesta

26

tengo otra respuesta que creo que es la mejor. Inicialmente solo estaba mostrando mi variable post.content tal como está, y las líneas nuevas no se estaban conservando. Ninguna de las soluciones aquí funcionó (bueno), y mi solución previa era solo una solución rápida y tenía problemas importantes. Esta es la verdadera solución:

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

¡Gran solución! – billwild

+0

¡Gracias esto funciona! –

-1

La solución fue poner etiquetas <pre></pre> alrededor del área donde tenía el contenido.

+2

eso no es una gran solución - pre tiene implicaciones en otras cosas, como el ajuste de línea. –

-1

La manera más fácil de hacerlo es escaparse del campo usted mismo, luego agregue saltos de línea. Cuando lo pases en jinja, márcalo como seguro para que no se autoescuela.

2

Usted puede utilizar el filtro |safe o utilice los autoescape bloques:

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

También podría establecer autoescaping en el environment-False.

+2

Pero, ¿y si no es seguro? – LtWorf

+0

@LtWorf tiene razón. Debe asumir que el contenido ingresado por el usuario es malicioso.La mayoría no lo será, pero no querrás que ese tipo malvado inserte JavaScript que les dé virus a tus usuarios. -1 – jpmc26

2

En el modelo de objetos, añadir una función como esta:

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

Luego, en su plantilla, se puede que:

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

Usted puede crear un filtro 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 

Es necesario añadir el filtro a su entorno Jinja2 antes de poder utilizarlo:

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

En su plantilla puede usar ese filtro:

{{post.content|nl2br}} 
0

Aquí hay un filtro escribió por mí mismo:

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 

y añadir el filtro a la jinja2.Environment() llamando:

jinja_env.filters['nl2br'] = nl2br 
+0

Tenga en cuenta que esto no es seguro ya que pasa contenido HTML. Debe ser: result = escape (value) .replace ("\ n", Markup ("
")) – gpothier

0

en cuenta que he autoescape de forma predeterminada, por lo que no comprueban que en esta función, pero esto es lo que estoy usando

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

luego, por supuesto,

jinja_env.filters['nl2br'] = nl2br