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
Respuesta
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 %}
¡Gran solución! – billwild
¡Gracias esto funciona! –
La solución fue poner etiquetas <pre></pre>
alrededor del área donde tenía el contenido.
eso no es una gran solución - pre tiene implicaciones en otras cosas, como el ajuste de línea. –
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.
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
.
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>
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}}
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
Tenga en cuenta que esto no es seguro ya que pasa contenido HTML. Debe ser: result = escape (value) .replace ("\ n", Markup ("
")) –
gpothier
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
- 1. Jinja2 en Google App Engine
- 2. TemplateNotFound: index.html con Google App Engine y Jinja2
- 3. URL relativas con Google App Engine y Jinja2
- 4. No se puede cargar jinja2 con webapp2/Google App Engine
- 5. Implementación de etiquetas en Google App Engine
- 6. Google Maps y Google App Engine
- 7. Google App Engine y dos.xml
- 8. Google App Engine y CORS
- 9. Google App Engine Locking
- 10. Google App Engine Geohashing
- 11. Etiquetas altamente escalables en Google App Engine (Python)
- 12. Google-app-engine NDB
- 13. Google App Engine
- 14. Django personalizados Etiquetas plantilla en Google App Engine
- 15. Google App Engine: get_or_create()?
- 16. Google app engine & CDN
- 17. Google App Engine: controladores y URL WSGI
- 18. API de App Engine y Google Drive
- 19. Web Scraping con Google App Engine
- 20. Comentarios sobre disponibilidad con Google App Engine
- 21. GeoModel con Google App Engine - consultas
- 22. Servicios web con Google App Engine
- 23. ¿Google App Engine es compatible con ftp?
- 24. Google App Engine y tiendas clave-valor
- 25. ¡Juego! 2.0 y Google App Engine
- 26. Google App Engine y nombre de dominio
- 27. ClassNotFoundException con Google App Engine para Java
- 28. yaml en Google App Engine con index.html
- 29. ¿Cómo usar sbt con Google App Engine?
- 30. ImportError en Google App Engine con lxml
Puede usar un 'textarea' si desea que se respeten las nuevas líneas. – bossylobster