Продовжимо розглядати основи роботи з bottle. Для тих, хто пропустив першу статтю: Створюємо простий блог на Bottle, частина 1.
Шаблонізатор
Bottle поставляється з швидким і потужним вбудованим движком-шаблонізатором SimpleTemplate Engine. Для рендерингу шаблона ми можемо використовувати функцію template(), або декоратор view(). Все, що вам потрібно зробити, це вказати ім'я шаблону і змінні, які ви хочете передати в шаблон як ключові аргументи. Приклад з використанням функції template():
@route('/hello')
@route('/hello/<name>')
def hello(name='Світ'):
return template('hello_template', name=name)
Наш код завантажить шаблон hello_template.tpl та відрендерить його зі змінною name. За замовчуванням bottle шукає шаблони в теці _'./views/'. _Якщо потрібно, можливо додати або видалити шляхи шаблонів за допомогою bottle.TEMPLATE_PATH списку.
import bottle
bottle.TEMPLATE_PATH.remove('./views/')
bottle.TEMPLATE_PATH.append('./templates/')
Приклад використання декоратору:
@route('/hello')
@route('/hello/<name>')
@view('hello_template')
def hello(name='Світ'):
return dict(name=name)
В декоратор view() ми передаємо назву шаблона, а нашою функцією hello повертаємо словник зі змінними.
Синтаксис шаблонізатора
І одразу до прикладу:
%if name == 'Світ':
<h1>Привіт {{ name }}!</h1>
<p>Ще якийсь текст.</p>
%else:
<h1>Привіт {{ name.title() }}!</h1>
<p>Як ти?</p>
%end
Знаком % ми виділяємо python код. Синтаксис майже повністю ідентичний за винятком того, що нам потрібно вручну вказувати кінець блоку за допомогою %end. Також нам потрібно обертати наші змінні або функціїї в подвійні фігурні дужки з обох сторін: {{ змінна }}
Відзначу, що шаблонізатор автоматично екранізує всі змінні в шаблонах, для захисту від XSS атак, якщо вам потрібно вставити якийсь html код на сторінку, потрібно вказати перед ім'ям змінної знак оклику(!):
>>> template('{{html_code}}', html_code='<b>Будь-який текст</b>')
u'<b>Будь-який текст</b>!'
>>> template('{{!html_code}}', html_code='<b>Будь-який текст</b>')
u'<b>Будь-який текст</b>'
Можливим є і вставка блоку python коду прямо в вашому шаблоні за допомогою "<% ... %>":
<p>Текст вище блоку</p>
<%
# Блок python коду
name = user.get_username()
%>
<p>Якийсь інший текст знизу</p>
Також в кожному шаблоні ми маємо доступ до передвстановлених ключових слів:
include
(sub_template**, ****variables)
Виконуює рендер суб-шаблону з визначеними змінними і вставляє його в поточний шаблон:
% include('header.tpl', title='Заголовок сторінки')
Контент
% include('foother.tpl')
rebase
(name**, ****variables)
Маркує поточний шаблон, щоб потім включити його в інший. Після рендеру
кінцевий текст зберігається в змінній base
та передається в батьківський
шаблон.
% rebase('base.tpl', title='Заголовок сторінки')
<p>Контент сторінки</p>
Та base.tpl:
<title>{{ title or 'Без заголовку' }}</title>
{{ !base }}
defined(_name_)
Повертає True, якщо змінна визначена і навпаки.
get(_name, default=None_)
Повертає змінну або стандартне значення.
setdefault(_name, default_)
Якщо змінна невизначена, присвоює їй стандартне значення. Повертає саму змінну.
Приклад:
% setdefault('text', 'Будь-який текст')
<h1>{{get('title', 'Без заголовка')}}</h1>
<p> {{ text }} </p>
% if defined('author'):
<p>Автора статті: {{ author }}</p>
% end
Заключення
Ми пройшлись по стандартному шаблонізатору bottle. Стаття вийшла трохи суховатою та без практичних прикладів, але я це виправлю в 3 частині, в якій ми перейдемо до практики: підключимо базу даних, статику та створимо сторінку входу в наш блог!
Ще немає коментарів