Створюємо простий блог на Bottle, частина 2

04 жовтня 2014 17:07 andreykko 743 0

Продовжимо розглядати основи роботи з 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:

<html>
<head>
  <title>{{ title or 'Без заголовку' }}</title>
</head>
<body>
  {{ !base }}
</body>
</html>

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 частині, в якій ми перейдемо до практики: підключимо базу даних, статику та створимо сторінку входу в наш блог!

743 7

Схожі матеріали:

Коментарі:

Авторизуйтесь, щоб залишити коментар.