Функция mark_safe

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

Синтаксис

pythonfrom django.utils.safestring import mark_safe

mark_safe(string)

Пример

Давайте пометим строку с HTML-тегами как безопасную для вывода в шаблоне:

pythonfrom 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-контента из модели:

pythonfrom 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

"):

python"<p>Some text</p>"

Пример

Используем mark_safe в комбинации с format_html для создания безопасного HTML:

pythonfrom 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)

Результат выполнения кода:

python"<strong><script>alert('xss')</script></strong>"

Пример

Создадим функцию, которая возвращает безопасный HTML для отображения статуса статьи:

pythonfrom 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)

Результат выполнения кода:

python"<span class=\"badge badge-success\">Published</span>"

Смотрите также

  • класс SafeString,
    который представляет строку, помеченную как безопасную
  • функция escape,
    которая экранирует специальные HTML-символы
  • функция format_html,
    которая форматирует строку с автоматическим экранированием аргументов
  • функция conditional_escape,
    которая экранирует строку, если она не помечена как безопасная