Übergabe von HTML an die Vorlage mit Flask / Jinja2

163

Ich erstelle einen Administrator für Flask und SQLAlchemy und möchte den HTML-Code für die verschiedenen Eingaben mithilfe von an meine Ansicht übergeben render_template. Das Template-Framework scheint sich automatisch aus dem HTML-Code zu entfernen, sodass alle <"'> in HTML-Entitäten konvertiert werden. Wie kann ich das deaktivieren, damit der HTML-Code korrekt gerendert wird?

Sharvey
quelle

Antworten:

343

der ideale weg ist zu

{{ something|safe }}

als die automatische Flucht vollständig auszuschalten.

iamgopal
quelle
2
hi @Armin Ronacher, würdest du bitte mehr erklären und ein Beispiel geben? Vielen Dank.
Samoth
Ich meine, ich habe zum Beispiel eine Datei namens userHome.htmlund möchte diese verwenden return render_template('userHome.html'), aber sie wird nicht korrekt gerendert und alle werden in meiner Chrome-Konsole zu HTML-Entitäten .
Samoth
Im transTag muss dies als{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur
1
Erwähnenswert ist, dass Sie dabei vorsichtig sein sollten, Schwachstellen bei Cross-Site Scripting zu vermeiden , da Sie den integrierten Schutz der Vorlagenbibliothek dagegen deaktivieren.
Harry Cutts
108

Sie können es auch als HTML-sicher für den Code deklarieren:

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

Übergeben Sie diesen Wert dann an die Vorlagen, und sie müssen ihn nicht |safe.

Armin Ronacher
quelle
4
Markup ist eine Jinja2-Klasse, ja. Es implementiert eine gemeinsame Schnittstelle, die von vielen Python-Bibliotheken unterstützt wird (leider nicht Django). Sie können auch das markup-sichere Paket verwenden, das dasselbe Objekt implementiert: pypi.python.org/pypi/MarkupSafe
Armin Ronacher
es existiert in jinja2
Giovanni G. PY
23

Aus dem Abschnitt jinja docs HTML Escaping :

Wenn die automatische Escape-Funktion aktiviert ist, wird standardmäßig alles maskiert, mit Ausnahme von Werten, die explizit als sicher gekennzeichnet sind. Diese können entweder von der Anwendung oder in der Vorlage mithilfe des Filters | safe markiert werden.

Beispiel:

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

Wenn Sie viele Variablen haben, die nicht maskiert werden müssen, können Sie einen autoescapeBlock verwenden:

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

Einige Leute scheinen die automatische Landschaft auszuschalten, was Sicherheitsrisiken birgt , um die Zeichenfolgenanzeige zu manipulieren.

Wenn Sie nur einige Zeilenumbrüche in einen String einfügen und die Zeilenumbrüche in einen konvertieren möchten <br />, können Sie ein Jinja-Makro wie folgt verwenden :

{% 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 Ihrer Vorlage nennen Sie dies einfach mit

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Helge
quelle