Flask / Jinja2を使用してテンプレートにHTMLを渡す


163

FlaskとSQLAlchemyの管理者を作成していますrender_template。さまざまな入力のHTMLをを使用してビューに渡します。テンプレートフレームワークはhtmlを自動的にエスケープするように見えるため、すべての<"'>はhtmlエンティティに変換されます。HTMLが正しくレンダリングされるように、それを無効にするにはどうすればよいですか?

回答:


343

理想的な方法は

{{ something|safe }}

自動エスケープを完全にオフにするよりも。


2
こんにちは@Armin Ronacher、もっと説明して例を挙げてください。ありがとう。
サモス2017

たとえば、というファイルがありuserHome.html、を使用したいのですがreturn render_template('userHome.html')、正しくレンダリングされず、すべてがchromeコンソールでhtmlエンティティに変わります。
サモス2017

transタグこれは、として使用する必要がある{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
テンプレートライブラリの組み込みの保護を無効にするため、これを行うときはクロスサイトスクリプティングの脆弱性を回避するように注意する必要があることを言及する価値があります。
ハリーカッツ2018

108

コードからHTMLセーフとして宣言することもできます。

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

次に、その値をテンプレートに渡します。テンプレートに渡す必要はありません|safe


4
マークアップはJinja2クラスです。多くのpythonライブラリ(残念ながらDjangoはサポートしていません)でサポートされている共通のインターフェースを実装しています。同じオブジェクトを実装するマークアップセーフパッケージを使用することもできます:pypi.python.org/pypi/MarkupSafe
Armin

jinja2に存在
Giovanni G. PY

23

jinja docsセクションのHTMLエスケープから

自動エスケープが有効になっている場合、安全と明示的にマークされた値を除いて、すべてがデフォルトでエスケープされます。これらは、アプリケーションでマークするか、テンプレートで安全フィルターを使用してマークできます。

例:

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

5

エスケープする必要のない変数がたくさんある場合は、autoescapeブロックを使用できます。

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

1

一部の人々は文字列の表示を操作するためのセキュリティリスク伴う自動エスケープをオフにしているようです。

いくつかの改行を文字列に挿入し、改行をに変換するだけの場合は<br />、次のようなジンジャマクロを使用できます。

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

そしてあなたに、テンプレートだけでこれを呼び出します

{{ linebreaks_for_string( my_string_in_a_variable ) }}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.