Передача 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.