Класс SafeString
Класс SafeString применяется для обёртки строк,
которые уже прошли необходимую обработку и могут быть
безопасно выведены в HTML-шаблонах без дополнительного
экранирования. Обычно экземпляры этого класса создаются
с помощью функции mark_safe. Основное назначение
SafeString - предотвратить повторное экранирование
строки в шаблонах, позволяя рендерить HTML-разметку.
Синтаксис
from django.utils.safestring import SafeString
safe_string = SafeString(value)
Класс принимает один обязательный аргумент - строку, которую нужно обернуть как безопасную.
Пример
Давайте создадим безопасную строку с HTML-разметкой и передадим её в шаблон:
from django.utils.safestring import SafeString
html_content = SafeString("<h1>Welcome to our site</h1><p>This is safe content</p>")
print(html_content)
Результат выполнения кода:
"<h1>Welcome to our site</h1><p>This is safe content</p>"
В шаблоне эта строка будет выведена как сырой HTML-код, а не экранированная строка.
Пример
Сравним поведение обычной строки и SafeString
в шаблоне. Создадим представление, которое передаёт
обе строки в контекст:
from 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:
<div>
{{ unsafe }}
</div>
<div>
{{ safe }}
</div>
Первая строка будет экранирована и выведена как текст,
а вторая - как HTML-тег <strong>.
Пример
Покажем, как работает конкатенация обычной строки
с SafeString. Результат всегда будет безопасным:
from 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))
Результат выполнения кода:
"<em>emphasized</em> and plain text"
"<class 'django.utils.safestring.SafeString'>"
Как видно, конкатенация сохраняет тип SafeString,
и вся строка считается безопасной.
Пример
Продемонстрируем использование SafeString вместе
с функцией format_html, которая уже возвращает
безопасную строку:
from 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))
Результат выполнения кода:
"<span class="user">Alice</span>"
"True"
format_html автоматически создаёт экземпляр
SafeString, упрощая работу с безопасными строками.
Смотрите также
-
функция
mark_safe,
которая создаёт экземпляр SafeString -
функция
escape,
которая экранирует специальные HTML-символы -
функция
format_html,
которая форматирует строку с HTML-разметкой -
функция
conditional_escape,
которая экранирует строку, если она не безопасна