Как изменить движок шаблонов в Pyramid? - PullRequest
2 голосов
/ 17 ноября 2011

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

Если я правильно понял, я должен зарегистрировать фабрику рендерера в __init__.py моего приложения для пирамиды.

config = Configurator(settings=settings)
config.add_renderer(None, 'pystache_renderer_factory')

Теперь мне нужно создать фабрику визуализации и не знаю как.

Несмотря на то, что я нашел документацию о том, как добавить шаблонизатор, мне не удалось его настроить.

Ответы [ 3 ]

5 голосов
/ 17 ноября 2011

Наконец я смог добавить механизм шаблонов pystache, следуя этому руководству:

https://groups.google.com/forum/#!searchin/pylons-discuss/add_renderer/pylons-discuss/Y4MoKwWKiUA/cyqldA-vHjkJ

Что я сделал:

создал файл mustacherenderer.py:

from pyramid.asset import abspath_from_asset_spec 
import pystache
import os 

def pystache_renderer_factory(info):
    template = os.path.join(abspath_from_asset_spec('myproj:templates', False),
                            info.name)
    f = open(template) 
    s = f.read() 
    f.close() 
    def _render(value, system):
        return pystache.render(s, value)
    return _render

добавил это к __init__.py:

config.add_renderer('.pmt', 'myproj.mustacherenderer.pystache_renderer_factory')

работает:)

2 голосов
/ 12 июля 2012

Обратите внимание, что этот ответ работает хорошо, пока вы не создадите свой проект Pyramid с помощью скаффолда.Как только вы это сделаете, этот связанный ответ окажется более полезным при построении вашей Pystache / Mustache_Renderer_Factory: Как интегрировать фисташку с пирамидой? .

2 голосов
/ 17 ноября 2011
Предполагается, что вторым аргументом

add_renderer является класс, реализующий интерфейс, показанный в «Добавление нового рендерера». Пирамида возьмет pystache_renderer_factory и попытается импортировать ее, поэтому в вашем коде строка import pystache_renderer_factory должна работать. Этот пример никогда не будет разрешен для класса, только для модуля или пакета, поэтому вам придется сначала это исправить. Это должно быть что-то вроде mypackage.pystache_renderer_factory.

Лучший способ научиться писать рендер - это, вероятно, взглянуть на уже написанные. В частности, пакет pyramid_jinja2 или в исходном коде Pyramid есть очень простые реализации рендереров json и jsonp. Обратите внимание, что все они предоставляют довольно уникальные способы реализации необходимого интерфейса. Каждая фабрика принимает объект info и возвращает вызываемый объект, который принимает объекты value и system.

https://github.com/Pylons/pyramid_jinja2/blob/master/pyramid_jinja2/init.py#L260

https://github.com/Pylons/pyramid/blob/master/pyramid/renderers.py#L135

...