Класс SafeString

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

Синтаксис

pythonfrom django.utils.safestring import SafeString

safe_string = SafeString(value)

Класс принимает один обязательный аргумент - строку, которую нужно обернуть как безопасную.

Пример

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

pythonfrom django.utils.safestring import SafeString

html_content = SafeString("<h1>Welcome to our site</h1><p>This is safe content</p>")
print(html_content)

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

python"<h1>Welcome to our site</h1><p>This is safe content</p>"

В шаблоне эта строка будет выведена как сырой HTML-код, а не экранированная строка.

Пример

Сравним поведение обычной строки и SafeString в шаблоне. Создадим представление, которое передаёт обе строки в контекст:

pythonfrom django.utils.safestring import SafeString
from django.shortcuts import render

def index_view(request):
  context = {
    "unsafe": "<script>alert('XSS')</script>",
    "safe": SafeString("<strong>Bold text</strong>"),
  }
  return render(request, "index.html", context)

В шаблоне index.html:

ninja<div>
  {{ unsafe }}
</div>
<div>
  {{ safe }}
</div>

Первая строка будет экранирована и выведена как текст, а вторая - как HTML-тег <strong>.

Пример

Покажем, как работает конкатенация обычной строки с SafeString. Результат всегда будет безопасным:

pythonfrom django.utils.safestring import SafeString

safe_part = SafeString("<em>emphasized</em>")
unsafe_part = " and plain text"
combined = safe_part + unsafe_part
print(combined)
print(type(combined))

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

python"<em>emphasized</em> and plain text"
"<class 'django.utils.safestring.SafeString'>"

Как видно, конкатенация сохраняет тип SafeString, и вся строка считается безопасной.

Пример

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

pythonfrom django.utils.html import format_html
from django.utils.safestring import SafeString

name = "Alice"
safe_html = format_html('<span class="user">{}</span>', name)
print(safe_html)
print(isinstance(safe_html, SafeString))

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

python"<span class="user">Alice</span>"
"True"

format_html автоматически создаёт экземпляр SafeString, упрощая работу с безопасными строками.

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

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