Passando HTML para o modelo usando o Flask / Jinja2


163

Estou construindo um administrador para o Flask e o SQLAlchemy e quero passar o HTML para as diferentes entradas para minha exibição usando render_template. A estrutura de modelos parece escapar automaticamente do html, para que todos os <"'> sejam convertidos em entidades html. Como posso desabilitar isso para que o HTML seja renderizado corretamente?

Respostas:


343

o caminho ideal é

{{ something|safe }}

do que desligar completamente o escape automático.


2
oi @ Armin Ronacher, você poderia explicar mais e dar um exemplo? obrigado.
— Samoth 22/02

Quero dizer, por exemplo, tenho um arquivo chamado userHome.htmle gostaria de usá- return render_template('userHome.html')lo, mas ele não é renderizado corretamente e todos se voltam para entidades html no meu console do Chrome.
— Samoth 22/02

Na transtag, isso deve ser usado como{% trans something=something|safe %}A {{something}} B{% endtrans %}
— Kangur 26/03

1
Vale ressaltar que você deve ter cuidado para evitar vulnerabilidades de scripts entre sites ao fazer isso, pois está desativando as proteções internas da biblioteca de modelos contra ela.
— Harry Cutts

108

Você também pode declarar HTML seguro a partir do código:

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

Em seguida, passe esse valor para os modelos e eles não precisam |safe.


4
A marcação é uma classe Jinja2, sim. Ele implementa uma interface comum suportada por muitas bibliotecas python (infelizmente não o Django). Você também pode usar o pacote de seguro de marcação que implementa o mesmo objeto: pypi.python.org/pypi/MarkupSafe
— Armin Ronacher

existe em jinja2
— Giovanni G. PY

23

Na seção de documentos jinja, escape de HTML :

Quando o escape automático está ativado, tudo é escapado por padrão, exceto os valores explicitamente marcados como seguros. Esses podem ser marcados pelo aplicativo ou no modelo usando o | filtro seguro.

Exemplo:

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

5

Quando você tem muitas variáveis ​​que não precisam ser escapadas, pode usar um autoescapebloco:

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

1

Algumas pessoas parecem desativar a saída automática, o que acarreta riscos de segurança para manipular a exibição de strings.

Se você deseja inserir apenas algumas quebras de linha em uma string e convertê-las em <br />, você pode usar uma 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 %}

e no seu modelo basta chamar isso com

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.