Передача HTML в шаблон с помощью Flask / Jinja2

163

Я создаю администратора для Flask и SQLAlchemy, и я хочу передать HTML для различных входных данных для моего представления, используя render_template. Кажется, что шаблонная среда автоматически выходит из html, поэтому все <"'> преобразуются в html-сущности. Как я могу отключить это, чтобы HTML отображался правильно?

sharvey
источник

Ответы:

344

идеальным способом является

{{ something|safe }}

чем полностью отключить авто-экранирование.

iamgopal
источник
2
привет @ Армин Ронахер, не могли бы вы объяснить подробнее и привести пример? Спасибо.
Самот
Я имею в виду, например, у меня есть файл с именем userHome.html, и я хотел бы использовать return render_template('userHome.html'), но он не отображается правильно, и все превращаются в html-объекты в моей консоли Chrome.
Самот
В transтеге этого должно быть использована в качестве{% trans something=something|safe %}A {{something}} B{% endtrans %}
Кангур
1
Стоит отметить, что вы должны быть осторожны, чтобы избежать уязвимостей межсайтового скриптинга, когда вы делаете это, так как вы отключаете встроенную защиту библиотеки шаблонов от этого.
Гарри Каттс
108

Вы также можете объявить HTML безопасным из кода:

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

Затем передайте это значение шаблонам, и они не должны к |safeнему.

Армин Ронахер
источник
4
Разметка - это класс Jinja2, да. Он реализует общий интерфейс, поддерживаемый многими библиотеками Python (к сожалению, не Django). Вы также можете использовать безопасный пакет разметки, который реализует тот же объект: pypi.python.org/pypi/MarkupSafe
Armin
это существует в jinja2
Джованни Г.
23

Из раздела Jinja Docs HTML Escape :

Когда включено автоматическое экранирование, по умолчанию все экранируются, кроме значений, явно помеченных как безопасные. Они могут быть помечены приложением или в шаблоне с помощью фильтра | safe.

Пример:

 <div class="info">
   {{data.email_content|safe}}
 </div>
daronwolff
источник
5

Если у вас много переменных, которые не нужно экранировать, вы можете использовать autoescapeблок:

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
NieDzejkob
источник
1

Некоторые люди, кажется, выключают autoescape, который несет риски безопасности, чтобы управлять отображением строки.

Если вы хотите вставить только некоторые разрывы строк в строку и преобразовать разрывы строк в <br />, то вы можете использовать макрос jinja, например:

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

и в вашем шаблоне просто вызовите это с

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Helge
источник