Домой Edit me on GitHub

2017-10-20

Шаблоны (Templates)

В пирамиде нет встроенного шаблонизатора. Представления (view callable) всегда отдают объект response. Этот объект может формироваться напрямую, например Response("Hello, world!"). При помощи встроенных обработчиков (string, json, jsonp), самописных или сторонних. Или через специальные функции, например pyramid.renderers.render_to_response().

Дополнительные обработчики могут поставляться сторонними модулями:

config.include('pyramid_chameleon') # Chameleon - template engine
config.include('pyramid_jinja2')    # Jinja2 -template engine
config.include('pyramid_mako')      # Mako -template engine

Использование напрямую

Обработка напрямую происходит при помощи функции pyramid.renderers.render_to_response().

Примечание

Предварительно нужно добавить расширение, которое знает как обрабатывать шаблоны Chameleon.

config.include('pyramid_chameleon')
from pyramid.renderers import render_to_response

def sample_view(request):
    return render_to_response('mypackage:templates/foo.pt',
                              {'foo':1, 'bar':2},
                              request=request)

Функция pyramid.renderers.render() вернет только текст, а не объект response.

from pyramid.renderers import render
from pyramid.response import Response

def sample_view(request):
    result = render('mypackage:templates/foo.pt',
                    {'foo':1, 'bar':2},
                    request=request)
    response = Response(result)
    return response

Такой подход позволяет, например, использовать возможности самого шаблонизатора напрямую.

from mako.template import Template
from pyramid.response import Response

def make_view(request):
    template = Template(filename='/templates/template.mak')
    result = template.render(name=request.params['name'])
    response = Response(result)
    return response

Использование через обработчики (renderer)

Альтернативный способ функции render_to_response(), это привязывать к представлению свой обработчик. При этом представление возвращает только словарь, который в последующем будет обработан этим рендерером.

from pyramid.view import view_config

@view_config(renderer='mypackage:templates/foo.jinja2')
def my_view(request):
    return {'foo':1, 'bar':2}

Этот код идентичен:

from pyramid.renderers import render
from pyramid.response import Response

def sample_view(request):
    result = render('mypackage:templates/foo.jinja2',
                    {'foo':1, 'bar':2},
                    request=request)
    response = Response(result)
    return response

pyramid_jinja2

Установка

pip install pyramid_jinja2

Настройка

Добавляется стандартными средствами:

config.Configurator()
config.include('pyramid_jinja2')

или

pyramid.includes=
    pyramid_jinja2

Использование

@view_config(renderer='mypackage:templates/mytemplate.jinja2')
def my_view(request):
    return {'foo': 1, 'bar': 2}

По умолчанию pyramid_jinja2 ищет директорию с шаблонами относительно вашего проекта, поэтому можно опустить название проекта.

@view_config(renderer='templates/mytemplate.jinja2')
def my_view(request):
    return {'foo': 1, 'bar': 2}
templates/mytemplate.jinja2
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Hello World!</title>
</head>
<body>
   <h1>{{ foo }}</h1>
   <h1>{{ bar }}</h1>
</body>
</html>

Резюме

Фреймворк Pyramid не ограничивает вас в использовании какого-либо определенного шаблонизатора. Вы можете выбрать любой который вам понравится или пользоваться несколькими, при этом можно написать собственные обработчики запросов, даже не привязанные к движкам шаблонов и даже написать свой собственный шаблонизатор с расширением для пирамиды, как например Tonnikala.

Previous: Предстваления (Views) Next: Сессии