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 1Django 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:
>script src="evil"<
Załóżmy teraz, że chcesz umieścić link <a href="link">text</a>
. Następnie django wyrenderuje go jako tekst za pomocą <>
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).