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?

Odpowiedzi:


344

idealnym sposobem jest

{{ something|safe }}

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


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.


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>

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 %}

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 ) }}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.