Модули приложений с пирамидой

Я создаю приложение рабочего процесса с пирамидой и ищу, как сделать приложение модулируемым: это означает создание основного приложения с моделями sqlalchemy, базовыми формами с wtforms и некоторыми базовыми шаблонами с mako.

Базовая структура приложения «Основное»:

    App_Core/core.ini
            /setup.py
            /...
            /App_Core/
                    /__init__.py
                    /models.py
                    /forms.py
                    /utils.py
                    /templates/
                    /templates/base.mako...
                    /static/
                    /static/staticfiles...

Моя цель — создать одно приложение для каждого рабочего процесса, которое будет включено в основное приложение: представляется возможным сделать это с помощью функции includeme, предоставляемой пирамидой.

Я хочу включить каждый рабочий процесс через файл core.ini, например:

pyramid.includes =       
   workflow_app1
   workflow_app2
   workflow_app3
   ...

Я определил новое приложение под названием workflow_app1 со следующей структурой:

worflow_app1/
            /setup.py
            /...
            /workflow_app1/
                         /__init__.py
                         /models.py
                         /forms.py
                         /views.py
                         /templates/
                         /templates/workflow_app1.mako
                         /...

А файл _init_.py будет содержать функцию includeme и определять новые маршруты:

def includeme(config):
    config.add_route('route1', '/route1/')
    config.add_route('route2', '/route2/')
    config.scan()

Когда я пишу представление для worflow_app1, я выполняю рендеринг в шаблон, включенный в это приложение, но когда я вызываю его из основного приложения, он не может отображать шаблон и выдает следующую ошибку:

TopLevelLookupException: Cant locate template for uri 'workflow-app1.mako'

Эта ошибка вполне логична, потому что в директиве mako.directories указан путь App_Core_PATH/templates, поэтому мой шаблон должен находиться в той же папке.

Вопрос1: Можно ли сделать мако поиск в каждой папке модулей нужных шаблонов?

Вопрос 2. Можно ли сделать так, чтобы workflow-app1.mako наследовал base.mako от основного приложения?

Заранее спасибо за ответ.


person Jérôme Pigeot    schedule 16.04.2013    source источник


Ответы (1)


Решение, которое я бы порекомендовал, — это переключиться на спецификации активов для ваших шаблонов. Они являются явными, допускают переопределение и обеспечивают лучший контроль над иерархией шаблонов. Это означает, что вы перестанете использовать mako.directories и вместо этого будете использовать 'workflow_app1:templates/workflow_app1.mako' в аргументах inherits, include или renderer. Учитывая это, очевидно, что вы можете наследовать base.mako в своем основном приложении, тогда как управлять опцией mako.directories сложнее.

Если вы застряли на mako.directories, вы можете добавлять в него строку каждый раз, когда добавляете пакет в pyramid.includes.

mako.directores = 
    App_Core:templates
    workflow_app1:templates
    workflow_app2:templates

Другой вариант — переключиться на jinja2, так как его плагин имеет возможность добавлять пути поиска постфактум. Таким образом, ваши включенные модули могут config.add_jinja2_search_path(...) ставить себя в порядке поиска. Интеграция mako в Pyramid сейчас не предлагает такой возможности.

person Michael Merickel    schedule 16.04.2013
comment
Это именно то, что я искал: спасибо, Майкл!! - person Jérôme Pigeot; 17.04.2013
comment
Параметр jinja полезен, но в моем случае совместного наследования между разными приложениями единственный способ — использовать спецификации активов. - person Jérôme Pigeot; 17.04.2013