Pasar HTML a la plantilla usando Flask / Jinja2

163

Estoy creando un administrador para Flask y SQLAlchemy, y quiero pasar el HTML para las diferentes entradas a mi vista usando render_template. El marco de plantillas parece escapar del html automáticamente, por lo que todos los <"'> se convierten en entidades html. ¿Cómo puedo desactivar eso para que el HTML se muestre correctamente?

Sharvey
fuente

Respuestas:

344

la forma ideal es

{{ something|safe }}

que apagar completamente el escape automático.

iamgopal
fuente
2
hola @Armin Ronacher, ¿podrías explicar más y dar un ejemplo? Gracias.
Samoth
Quiero decir, por ejemplo, tengo un archivo llamado userHome.html, y me gustaría usarlo return render_template('userHome.html'), pero no se procesa correctamente y todos recurren a entidades html en mi consola Chrome.
Samoth
En la transetiqueta, esto debe usarse como{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur
1
Vale la pena mencionar que debe tener cuidado de evitar las vulnerabilidades de Cross-Site Scripting cuando haga esto, ya que deshabilita las protecciones integradas de la biblioteca de plantillas contra ella.
Harry Cutts
108

También puede declararlo HTML seguro del código:

from flask import Markup
value = Markup('<strong>The HTML String</strong>')

Luego pase ese valor a las plantillas y no tienen que |safe hacerlo.

Armin Ronacher
fuente
44
Markup es una clase Jinja2, sí. Implementa una interfaz común compatible con muchas bibliotecas de Python (desafortunadamente no Django). También puede usar el paquete seguro de marcado que implementa el mismo objeto: pypi.python.org/pypi/MarkupSafe
Armin Ronacher
existe en jinja2
Giovanni G. PY
23

De la sección de documentos jinja HTML Escaping :

Cuando el escape automático está habilitado, todo se escapa por defecto, excepto los valores marcados explícitamente como seguros. Esos pueden ser marcados por la aplicación o en la plantilla usando el filtro seguro.

Ejemplo:

 <div class="info">
   {{data.email_content|safe}}
 </div>
daronwolff
fuente
5

Cuando tiene muchas variables que no necesitan escapar, puede usar un autoescapebloque:

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
NieDzejkob
fuente
1

Algunas personas parecen desactivar el autoescape , lo que conlleva riesgos de seguridad para manipular la visualización de la cadena.

Si solo desea insertar algunos saltos de línea en una cadena y convertirlos en saltos de línea <br />, entonces podría tomar una macro jinja como:

{% macro linebreaks_for_string( the_string ) -%}
{% if the_string %}
{% for line in the_string.split('\n') %}
<br />
{{ line }}
{% endfor %}
{% else %}
{{ the_string }}
{% endif %}
{%- endmacro %}

y en su plantilla simplemente llame a esto con

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Helge
fuente