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


163

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

Ответы:


344

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

{{ something|safe }}

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


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>

5

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

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

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 ) }}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.