Шаблон Django экранирование

система шаблонов Django предоставляет несколько опций (фильтров) для экранирования содержимого в html, но они немного смущают меня как новичка. Скажем, я следую учебнику, чтобы сделать простой блог, и содержание блога должно быть экранировано - я доверяю содержимому, потому что я единственный, кто его редактирует. Поэтому вопрос в том, должен ли я делать это как {{ post.content|autoescape }}, {{ post.content|escape }} или {{ post.content|safe }} в html?

спасибо

EDIT: какой фильтр я должен использовать для специальных символов автоматически преобразуется в объекты html?

EDIT 2: я только что понял, что autoescape не является допустимым фильтром.

4 ответов


HTML escaping включен по умолчанию в шаблонах Django.

Autoescape-это тег. не фильтр:

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

фильтр "escape" экранирует HTML-код строки. В частности, он делает эти замены:

  • <
  • > превращается в >
  • ' (одинарная кавычка) преобразуется в '
  • " (двойная кавычка) преобразуется в "
  • & преобразуется в &

"force_escape" почти идентичен "escape", за исключением нескольких угловых случаев.

"безопасный" фильтр пометит ваш контент как безопасный, поэтому он не будет экранирован (будет отправлен в браузер как есть).

какой фильтр следует использовать для автоматического преобразования специальных символов в объекты html?

Ну, вы имеете в виду, как преобразование Ã to Ã? Придерживайтесь кодировки utf-8 и забудьте о тех.


прежде всего, вы должны избежать вашего контента, потому что вы никогда не знаете (даже если вы тот, кто вводит данные), если вам понадобится специальный символ (например,,).

синтаксис показать вам неудобно с применением экранирования :

этой

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

точно так же, как этот

{{ content|escape }}

этой

{{ content }}

точно так же, как это

{{ content|safe }} 

Safe используется так:

{% autoescape on %}
    {{ content }}  <-- escape
    {{ content|safe }}  <-- not escape
{% endautoescape %}

ваш вопрос показывает, что вы немного смущены тем, что такое побег.

Escaping превращает небезопасные символы - такие как HTML-теги-в бежал версии, чтобы вредоносный контент, такой как теги скриптов, не разрушал ваш сайт. Django делает это по умолчанию для всего содержимого, отображаемого в шаблоне из переменной.

по вашему комментарию кажется, что вы единственный, кто редактирует ваш контент, который вы хотите отобразить свои переменные без автоматическое экранирование. Поэтому, для этого, вы должны отметить его как безопасный. Вы можете либо сделать это в шаблоне, либо обернуть всю партию в {% autoescape off %}...{% endautoescape %} теги или через {{ myvar|safe }} фильтр по отдельным переменным. Или вы можете сделать это в представлении, позвонив mark_safe(myvar) по отдельным переменным перед их передачей в шаблон.


чтобы избежать побега, используйте "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.