Ich baue einen Administrator für Flask und SQLAlchemy und möchte den HTML-Code für die verschiedenen Eingaben an meine Ansicht übergeben render_template
. Das Templating-Framework scheint HTML automatisch zu entkommen, also alle <"'>
Zeichen werden in HTML-Entitäten umgewandelt. Wie kann ich das deaktivieren, damit das HTML korrekt gerendert wird?
Übergeben von HTML an die Vorlage mit Flask/Jinja2
scharf
iamgopal
Um das automatische Escape beim Rendern eines Werts zu deaktivieren, verwenden Sie die |safe
Filter.
{{ something|safe }}
Tun Sie dies nur bei Daten, denen Sie vertrauen, da das Rendern nicht vertrauenswürdiger Daten ohne Escapezeichen eine Cross-Site-Scripting-Schwachstelle ist.
Armin Ronacher
MarkupSafe stellt das Autoescape-Verhalten von Jinja bereit. Sie können importieren Markup
und verwenden Sie es, um einen HTML-sicheren Wert aus dem Code zu deklarieren:
from markupsafe import Markup
value = Markup('<strong>The HTML String</strong>')
Übergeben Sie das an die Vorlagen und Sie müssen die nicht verwenden |safe
darauf filtern.
daronwolff
Aus der Jinja-Dokumentationssektion HTML-Escapezeichen:
Wenn das automatische Escaping aktiviert ist, wird standardmäßig alles maskiert, mit Ausnahme von Werten, die ausdrücklich als sicher gekennzeichnet sind. Diese können entweder von der Anwendung oder in der Vorlage mit gekennzeichnet werden
|safe
Filter.
Beispiel:
<div class="info">
{{data.email_content|safe}}
</div>
Maya
Wenn Sie viele Variablen haben, die nicht maskiert werden müssen, können Sie eine verwenden autoescape
überschreiben Block:
{% autoescape false %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
Helge
Manche Leute scheinen sich umzudrehen Automatische Flucht ab, was trägt Sicherheits Risikos um die String-Anzeige zu manipulieren.
Wenn Sie nur einige Zeilenumbrüche in eine Zeichenfolge einfügen und die Zeilenumbrüche in konvertieren möchten <br />
dann könntest du eine nehmen Jinja-Makro wie:
{% macro linebreaks_for_string( the_string ) -%}
{% if the_string %}
{% for line in the_string.split('\n') %}
<br />
{{ line }}
{% endfor %}
{% else %}
{{ the_string }}
{% endif %}
{%- endmacro %}
und in deinem Schablone Rufen Sie diese einfach mit an
{{ linebreaks_for_string( my_string_in_a_variable ) }}
Greenie-Bohnen
Verwenden Sie die safe
filtern Sie in Ihrer Vorlage und bereinigen Sie dann den HTML-Code mit das bleach
Bibliothek aus deiner sicht. Mit Bleach können Sie die HTML-Tags, die Sie verwenden müssen, auf die Whitelist setzen.
Das ist meines Wissens am sichersten. Ich habe beides ausprobiert safe
Filter und die Markup
Klasse, und beide Möglichkeiten erlaubten mir, unerwünschtes JavaScript auszuführen. Nicht sehr sicher!
Tom M
Um speziell mit Zeilenumbrüchen umzugehen, habe ich eine Reihe von Optionen ausprobiert, bevor ich mich schließlich dafür entschieden habe:
{% set list1 = data.split('\n') %}
{% for item in list1 %}
{{ item }}
{% if not loop.last %}
<br/>
{% endif %}
{% endfor %}
Das Schöne an diesem Ansatz ist, dass er mit dem automatischen Escaping kompatibel ist und alles schön und sicher bleibt. Es kann auch mit Filtern wie urlize kombiniert werden.
Natürlich ähnelt es Helges Antwort, benötigt aber kein Makro (verlässt sich stattdessen auf Jinjas eingebaute split
Funktion) und fügt auch keine unnötige hinzu <br/>
nach dem letzten Artikel.