1

我正在使用金字塔创建工作流应用程序,并且正在搜索如何使应用程序可模块化:这意味着使用 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...

我的目标是为每个工作流创建1 个应用程序,这些应用程序将包含在核心应用程序中:似乎可以通过金字塔提供的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:是否可以在模块的每个文件夹中进行mako搜索想要的模板?

问题2:是否可以让workflow-app1.mako从核心app继承base.mako?

提前感谢您的回答。

4

1 回答 1

1

我推荐的解决方案是切换到模板的资产规格。它们是显式的,允许覆盖,并提供对模板层次结构的更好控制。这意味着您将停止使用mako.directories,而是'workflow_app1:templates/workflow_app1.mako'在您的inheritsorincluderenderer参数中使用。鉴于此,很明显您可以从您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(...)将自己投入查找顺序。Pyramid 的 mako 集成目前不提供此选项。

于 2013-04-16T16:05:05.063 回答