Класс Markup
Класс Markup применяется для создания строки,
которую Flask и Jinja считают безопасным HTML.
Обычные строки при выводе в шаблон экранируются:
символы <, > и & заменяются на
безопасные сущности. Обёртка Markup отключает
это экранирование для конкретной строки.
Первым параметром передаётся строка с HTML-кодом.
Класс наследуется от обычной строки str,
поэтому с ним работают все строковые методы.
Синтаксис
from markupsafe import Markup
res = Markup(object)
Пример
Давайте сравним обычную строку и строку,
обёрнутую в Markup:
from flask import Flask
from markupsafe import Markup
app = Flask(__name__)
@app.route('/')
def index():
plain = '<b>hello</b>'
safe = Markup('<b>hello</b>')
return plain + safe
Результат выполнения кода:
<b>hello</b><b>hello</b>
Как видите, обычная строка была экранирована,
а обёрнутая в Markup - нет.
Пример
Давайте передадим безопасный HTML в шаблон:
from flask import Flask, render_template
from markupsafe import Markup
app = Flask(__name__)
@app.route('/')
def index():
text = Markup('<b>hello</b>')
return render_template('index.html', text=text)
А в шаблоне выведем переменную:
<p>{{ text }}</p>
Результат выполнения кода:
<p><b>hello</b></p>
Если бы переменная была обычной строкой,
тег b отобразился бы как текст.
Пример
Давайте создадим безопасный фрагмент через
метод format, который есть у Markup:
from flask import Flask
from markupsafe import Markup
app = Flask(__name__)
@app.route('/')
def index():
template = Markup('<a href="/user/{}">{}</a>')
res = template.format('abcde', 'user')
return res
Результат выполнения кода:
<a href="/user/abcde">user</a>
Обратите внимание: значения, переданные в format,
при этом экранируются, если не являются Markup.