/ / Dlaczego i kiedy używać funkcji Django mark_safe () - django, django-templates

Dlaczego i kiedy używać funkcji Django mark_safe () - django, django-templates

Po przeczytaniu dokumentu mark_safe () nadal wydaje się mitem. Myślę, że jest to związane z materiałami CSRF. Ale dlaczego i kiedy należy użyć mark_safe ()?

Oto dokumentacja

mark_safe (s) [źródło] ¶

Jawnie oznacz ciąg jako bezpieczny dla (HTML) cele wyjściowe. Zwrócony obiekt może być używany wszędzie w przypadku ciągu znaków lub obiekt unicode jest odpowiedni.

Może być wywołany wiele razy na jednym ciągu.

Do budowania fragmentów HTML zwykle powinieneś używać Zamiast tego django.utils.html.format_html ().

Łańcuch oznaczony jako bezpieczny ponownie stanie się niebezpieczny, jeśli zostanie zmodyfikowany. Na przykład:

Odpowiedzi:

11 dla odpowiedzi nr 1

Django to framework, który domyślnie próbuje zrobić "właściwą" rzecz. Oznacza to, że kiedy robisz najprostszą rzecz, prawdopodobnie robisz to, co należy.

Teraz spójrzmy na jakiś szablon w php i pythonie:

PHP:

<? echo $foo ?>

Może dać:

<script src="evil">

Django:

{{ foo }}

Daje z tym samym wejściem:

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

Załóżmy teraz, że chcesz umieścić link <a href="link">text</a>. Następnie django wyrenderuje go jako tekst za pomocą &lt;&gt; jeszcze raz. Jeśli wiesz, co robisz, możesz teraz użyć mark_safe aby wskazać, że tekst jest zaufany (tj. nie pochodzi z userinput).

Zwykle będziesz używać {{ foo|safe }} lub {% autoescape off %}{{ foo }}{% endautoescape %} w twoich szablonach jako programista django, który jest bardziej przejrzysty, gdy łańcuch jest deklarowany jako bezpieczny.

Gdzie jest mark_safe używany? Kiedy piszesz własne szablony lub filtry, musisz oznaczyć ciąg znaków jako bezpieczny od Pythona, ponieważ programista założy, że {{foo | mylinkifyfunction}} robi to, co trzeba (to znaczy, że ucieka od adresu URL, ale nie ucieka <a href=""></a> wokół adresu URL).