Передача HTML до шаблону за допомогою Flask / Jinja2


163

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

Відповіді:


344

ідеальний шлях - це

{{ something|safe }}

ніж повністю вимкнути автоматичне втечу.


2
привіт @Armin Ronacher, будь ласка, поясни, будь ласка, більше і наводиш приклад? Дякую.
Самот

Я маю на увазі, наприклад, у мене є файл, який називається userHome.html, і я хотів би його використовувати return render_template('userHome.html'), але він не відображається правильно, і всі звертаються до html-об'єктів на моїй хромованій консолі.
Самот

У 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 Ronacher

він існує у jinja2
Джованні Г. PY

23

Із розділу Документи jinja HTML Есканація :

Якщо ввімкнено автоматичне вимкнення, за замовчуванням уникає все, крім значень, явно позначених як безпечне. Вони можуть бути позначені додатком або шаблоном, використовуючи безпечний фільтр.

Приклад:

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

5

Коли у вас є багато змінних, які не потребують виходу, ви можете використовувати autoescapeблок:

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

1

Деякі люди, здається, відключають автоматичний пейзаж , що несе ризики для безпеки, щоб маніпулювати рядковим дисплеєм.

Якщо ви хочете лише вставити рядки у рядок і перетворити рядки <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.