Übergeben von HTML an die Vorlage mit Flask/Jinja2

Lesezeit: 3 Minuten

Benutzer-Avatar
scharf

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?

Benutzer-Avatar
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.

Benutzer-Avatar
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.

Benutzer-Avatar
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>

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

Benutzer-Avatar
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 ) }}

Benutzer-Avatar
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!

Benutzer-Avatar
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.

1055100cookie-checkÜbergeben von HTML an die Vorlage mit Flask/Jinja2

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy