Метод join
Метод join применяется к экземпляру класса Markup
и объединяет последовательность элементов в одну строку разметки.
Первым параметром передаётся итерируемый объект с элементами,
которые нужно соединить. В отличие от обычного строкового
метода join, все неэкранированные строки автоматически
экранируются, что защищает от XSS-атак. Уже готовые объекты
Markup вставляются без изменений.
Синтаксис
Markup(separator).join(iterable)
Пример
Давайте объединим несколько фрагментов разметки с помощью запятой:
from flask import Flask, Markup
app = Flask(__name__)
@app.route('/')
def index():
items = [
Markup('<b>abcde</b>'),
Markup('<i>hello</i>'),
Markup('<u>user</u>')
]
res = Markup(', ').join(items)
return res
Результат выполнения кода:
<b>abcde</b>, <i>hello</i>, <u>user</u>
Пример
Давайте передадим в метод список обычных строк и посмотрим, как сработает автоматическое экранирование:
from flask import Flask, Markup
app = Flask(__name__)
@app.route('/')
def index():
items = ['<b>abcde</b>', 'hello', '<i>user</i>']
res = Markup('<br>').join(items)
return res
Результат выполнения кода:
<b>abcde</b><br>hello<br><i>user</i>
Как видим, обычные строки были экранированы, а разделитель
Markup('<br>') вставился как готовая разметка.
Пример
Давайте смешаем в одной последовательности объекты Markup
и обычные строки, чтобы увидеть разницу в обработке:
from flask import Flask, Markup
app = Flask(__name__)
@app.route('/')
def index():
items = [
Markup('<b>abcde</b>'),
'<i>hello</i>',
Markup('<u>user</u>')
]
res = Markup(' | ').join(items)
return res
Результат выполнения кода:
<b>abcde</b> | <i>hello</i> | <u>user</u>
Пример
Давайте используем метод join вместе с генератором
для построения списка ссылок:
from flask import Flask, Markup
app = Flask(__name__)
@app.route('/')
def index():
users = ['abcde', 'hello', 'user']
links = Markup('</li><li>').join(
Markup('<a href="/user/%s">%s</a>') % (u, u)
for u in users
)
res = Markup('<ul><li>') + links + Markup('</li></ul>')
return res
Результат выполнения кода:
<ul><li><a href="/user/abcde">abcde</a></li><li><a href="/user/hello">hello</a></li><li><a href="/user/user">user</a></li></ul>