37

Django テンプレート システムには、html のコンテンツをエスケープするためのいくつかのオプション (フィルター) が用意されていますが、初心者の私には少し混乱します。簡単なブログを作成するためのチュートリアルに従っており、ブログのコンテンツをエスケープする必要があるとします。コンテンツを編集しているのは私だけなので、コンテンツを信頼しています。問題は{{ post.content|autoescape }}、 、{{ post.content|escape }}、または{{ post.content|safe }}html のように行うべきかということです。

ありがとう

編集:特殊文字をhtmlエンティティに自動的に変換するには、どのフィルターを使用すればよいですか?

編集 2: autoescape が有効なフィルターではないことに気付きました。

4

4 に答える 4

50

Django テンプレートでは、HTML エスケープがデフォルトでオンになっています。

オートエスケープはタグです。フィルターではありません:

{% autoescape on %}
    {{ post.content }}
{% endautoescape %}

「エスケープ」フィルタは文字列の HTML をエスケープします。具体的には、次の置換を行います。

  • < に変換されます&lt;
  • > に変換されます&gt;
  • ' (シングル クォーテーション) に変換されます。&#39;
  • " (ダブル クォーテーション) は次のように変換されます。&quot;
  • & に変換されます&amp;

「force_escape」は、いくつかの特殊なケースを除いて、「escape」とほとんど同じです。

「安全」フィルターはコンテンツを安全としてマークするため、エスケープされません (そのままブラウザーに送信されます)。

特殊文字を自動的に html エンティティに変換するには、どのフィルターを使用すればよいですか?

ええと、つまり、に変換Ãするようなもの&Atilde;ですか?ずっと utf-8 エンコーディングに固執し、それらのことは忘れてください。

于 2012-07-03T08:15:08.397 に答える
28

まず、特殊文字(<、>、など)が必要かどうかがわからないため(データを入力する人であっても)、コンテンツをエスケープする必要があります。

使用する構文は、エスケープの使用に不快感があることを示しています。

これ

{% autoescape on %}
    {{ content }}
{% endautoescape %}

これとまったく同じです

{{ content|escape }}

これ

{{ content }}

これとまったく同じです<-編集:自動エスケープがオフの場合(Paulo Scardineに感謝)

{{ content|safe }} 

安全はそのような使用です:

{% autoescape on %}
    {{ content }}  <-- escape
    {{ content|safe }}  <-- not escape
{% endautoescape %}
于 2012-07-03T08:22:27.610 に答える
10

あなたの質問は、エスケープとは何かについて少し混乱していることを示しています。

エスケープとは、スクリプト タグなどの悪意のあるコンテンツによってサイトが破壊されないように、HTML タグなどの安全でない文字をエスケープバージョンに変換することです。Django は、変数からテンプレートにレンダリングされたすべてのコンテンツに対してデフォルトでこれを行います。

あなたのコメントによると、コンテンツを編集しているのはあなただけで、自動エスケープなしで変数をレンダリングする必要があるようです。したがって、そのためには、安全であるとマークする必要があります。テンプレートでこれを行うには、ロット全体を{% autoescape off %}...{% endautoescape %}タグでラップするか{{ myvar|safe }}、個々の変数のフィルターを使用します。mark_safe(myvar)または、テンプレートに渡す前に個々の変数を呼び出して、ビューで行うこともできます。

于 2012-07-03T08:14:36.333 に答える
0

エスケープを回避するには、「safe」(https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe)を使用します。

出力前にHTMLをエスケープする必要がないことを文字列にマークします。自動エスケープがオフの場合、このフィルターは効果がありません。

エスケープするには、「escape」(https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape)を使用します。

文字列のHTMLをエスケープします。

于 2012-07-03T08:02:44.427 に答える