/ /なぜ、Djangoを使用するのかmark_safe()関数 - django、django-templates

なぜ、なぜDjangoを使用するmark_safe()関数 - django、django-templates

文書を読んだら、mark_safe()はまだ神話のようです。私はそれがCSRFに関係していると思います。しかし、なぜ、いつ、mark_safe()を使うべきですか?

ここにはドキュメントがあります

mark_safe(s)[ソース]¶

明示的に文字列を(HTML) 出力目的。返されるオブジェクトは、文字列のどこでも使用できます またはユニコードオブジェクトが適切です。

1つの文字列に対して複数回呼び出すことができます。

HTMLの断片を構築するには、通常は 代わりにdjango.utils.html.format_html()を使用してください。

safeとマークされた文字列は、変更された場合に再び危険になります。例えば:

回答:

回答№1の11

Djangoはデフォルトで "正しい"ことをしようとするフレームワークです。これは、あなたが最も簡単なことをするときに、適切に正しいことをしていることを意味します。

今、phpとpythonのテンプレートを見てみましょう:

PHP:

<? echo $foo ?>

与えることができる:

<script src="evil">

Django:

{{ foo }}

同じ入力を与えます:

&gt;script src="evil"&lt;

ここで、リンクを配置するとします。 <a href="link">text</a>。それから、djangoはそれをテキストとしてレンダリングします &lt;&gt; 再び。あなたが何をやっているのか分かっているなら、 mark_safe テキストが信頼できる(すなわち、ユーザ入力から来ていない)ことを示す。

通常、あなたは使用します {{ foo|safe }} または {% autoescape off %}{{ foo }}{% endautoescape %} djangoプログラマーとしてのテンプレートでは、文字列が安全であると宣言されたときにはより明確になります。

だから、どこに mark_safe 中古? 独自のtemplatetagsやフィルタを書くときは、Pythonから安全であるとマークする必要があります。なぜなら、{{foo | mylinkifyfunction}}が正しいことをしている(つまり、url fooをエスケープしますが、エスケープしませんその <a href=""></a> URLの周りに)。