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?

Respuestas:


344

la forma ideal es

{{ something|safe }}

que apagar completamente el escape automático.


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.


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>

5

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

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

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 ) }}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.