Przekazywanie kodu HTML do szablonu za pomocą Flask / Jinja2

163

Buduję administratora dla Flask i SQLAlchemy i chcę przekazać HTML dla różnych danych wejściowych do mojego widoku za pomocą render_template. Wygląda na to, że struktura szablonów automatycznie wymyka się z html, więc wszystkie <"'> są konwertowane na encje HTML. Jak mogę to wyłączyć, aby HTML renderował się poprawnie?

sharvey
źródło

Odpowiedzi:

344

idealnym sposobem jest

{{ something|safe }}

niż całkowite wyłączenie automatycznego ucieczki.

iamgopal
źródło
2
cześć @Armin Ronacher, czy mógłbyś wyjaśnić więcej i podać przykład? dzięki.
Samoth
Mam na myśli, na przykład, mam plik o nazwie userHome.htmli chciałbym go użyć return render_template('userHome.html'), ale nie renderuje się on poprawnie i wszystkie zwracają się do jednostek html w mojej konsoli chrome.
Samoth
W transtagu musi to być używane jako{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur
1
Warto wspomnieć, że należy zachować ostrożność, aby uniknąć luk w zabezpieczeniach skryptów między lokacjami, gdy to robisz, ponieważ wyłączasz wbudowane zabezpieczenia biblioteki szablonów.
Harry Cutts,
108

Możesz również zadeklarować go jako bezpieczny HTML z kodu:

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

Następnie przekaż tę wartość do szablonów, a oni nie muszą tego robić |safe.

Armin Ronacher
źródło
4
Znaczniki to klasa Jinja2, tak. Implementuje wspólny interfejs obsługiwany przez wiele bibliotek Pythona (niestety nie Django). Możesz także użyć pakietu bezpiecznego dla znaczników, który implementuje ten sam obiekt: pypi.python.org/pypi/MarkupSafe
Armin Ronacher.
istnieje w jinja2
Giovanni G. PY
23

Z sekcji jinja docs HTML Escaping :

Gdy automatyczne uciekanie jest włączone, domyślnie wszystkie są chronione za wyjątkiem wartości jawnie oznaczonych jako bezpieczne. Można je zaznaczyć w aplikacji lub w szablonie przy użyciu filtru | safe.

Przykład:

 <div class="info">
   {{data.email_content|safe}}
 </div>
daronwolff
źródło
5

Jeśli masz wiele zmiennych, które nie wymagają ucieczki, możesz użyć autoescapebloku:

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
NieDzejkob
źródło
1

Niektórzy ludzie zdają się wyłączać autoescape , co niesie ze sobą zagrożenie bezpieczeństwa związane z manipulowaniem wyświetlaniem napisów.

Jeśli chcesz tylko wstawić kilka podziałów wierszy do ciągu i przekonwertować te podziały na <br />, możesz wziąć makro jinja, takie jak:

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

aw szablonie po prostu nazwij to za pomocą

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Helge
źródło