Функция mark_safe
Функция mark_safe применяется к строке и возвращает объект типа SafeString, который помечен как безопасный для вывода в HTML. Когда строка помечена как безопасная, Django не будет экранировать специальные HTML-символы при рендеринге шаблонов. Функция принимает единственный аргумент - строку, которую нужно пометить как безопасную.
Синтаксис
from django.utils.safestring import mark_safe
mark_safe(string)
Пример
Давайте пометим строку с HTML-тегами как безопасную для вывода в шаблоне:
from django.utils.safestring import mark_safe
html_content = "<strong>Hello</strong> <em>World</em>"
safe_html = mark_safe(html_content)
# В шаблоне {{ safe_html }} выведет: <strong>Hello</strong> <em>World</em>
# Без mark_safe Django экранировал бы строку: <strong>Hello</strong>...
Пример
Используем mark_safe для вывода динамического HTML-контента из модели:
from django.utils.safestring import mark_safe
from myapp.models import Article
article = Article.objects.get(pk=1)
formatted_content = mark_safe(article.content)
# Теперь в шаблоне {{ formatted_content }} выведет HTML-разметку
# без экранирования
print(formatted_content)
Результат выполнения кода (если article.content содержит "
Some text
"):"<p>Some text</p>"
Пример
Используем mark_safe в комбинации с format_html для создания безопасного HTML:
from django.utils.safestring import mark_safe
from django.utils.html import format_html
username = "<script>alert('xss')</script>"
escaped_username = mark_safe(username) # Это потенциально опасно!
# Правильный способ - использовать format_html с экранированием
safe_html = format_html("<strong>{}</strong>", username)
print(safe_html)
Результат выполнения кода:
"<strong><script>alert('xss')</script></strong>"
Пример
Создадим функцию, которая возвращает безопасный HTML для отображения статуса статьи:
from django.utils.safestring import mark_safe
from myapp.models import Article
def get_status_badge(article):
if article.status == 'published':
html = '<span class="badge badge-success">Published</span>'
else:
html = '<span class="badge badge-warning">Draft</span>'
return mark_safe(html)
# Использование в шаблоне: {{ article|get_status_badge }}
article = Article.objects.get(pk=1)
result = get_status_badge(article)
print(result)
Результат выполнения кода:
"<span class=\"badge badge-success\">Published</span>"
Смотрите также
-
класс
SafeString,
который представляет строку, помеченную как безопасную -
функция
escape,
которая экранирует специальные HTML-символы -
функция
format_html,
которая форматирует строку с автоматическим экранированием аргументов -
функция
conditional_escape,
которая экранирует строку, если она не помечена как безопасная