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?

sharvey
fonte

Respostas:

343

o caminho ideal é

{{ something|safe }}

do que desligar completamente o escape automático.

iamgopal
fonte
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.

Armin Ronacher
fonte
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>
daronwolff
fonte
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 %}
NieDzejkob
fonte
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 ) }}
Helge
fonte