使金字塔应用程序为独立和嵌入模式做好准备

时间:2013-07-25 15:27:30

标签: plugins pyramid

我正在开发一个wiki引擎。由于此应用程序本身可用(至少对于我公司的私人用途)它应该能够作为独立的金字塔应用程序运行,具有自己的图形主题。 然而,wiki功能也可以作为更大项目的一部分,我希望能够将其包含在其他金字塔应用程序中。

我已经发现了一些可以帮助我实现这一目标的金字塔功能,但首先我不确定这是否是最好的方法,其次是一些问题仍未解决。

以下是我目前看到的潜在问题:

  • 模板:如何在独立模式和托管模式之间切换

  • 主机变量:如果我们可以重用主机模板,则可能需要一些变量才能正确呈现模板,但客户(wiki引擎)应用程序不会设置这些变量。

  • 身份验证:来宾应用定义了自己的登录系统(基于pyramid_persona)。来宾应用程序可以重用主机认证系统吗?

我目前的想法是使用config.include()金字塔系统。在wiki引擎中,在__init__.py中,我还定义了include(config)方法以及用于独立模式的main()方法。

在宿主应用程序中,我然后在.ini文件中定义一个变量,该变量指向访客应该使用的模板文件(即base_template = hostapp:templates/wikibase.mako

在来宾应用程序中,includeme()方法读取base_template变量并覆盖某些全局配置。

然后每个访客视图的工作方式如下:

from pyramid.renderers import render

@view_config(route_name="display_wiki_page",  renderer=Globals.base_template)
def view_wiki(request):
    """returns a formatted page content"""
    page = request.matchdict['page']
    content = get_raw_page_content_from_database(page)

    page_formatted = render("wikiengine:templates/page_formatting_template.mako", 
        {'request': request, 'content': content} )

    return {'page_formatted': page_formatted}

因此,从这一点开始,基本模板可以是来宾或主机应用程序中的模板。两者都包含类似(在mako中):${page_formatted | n }

但是这并没有解决客户代码呈现模板所需的宿主变量的问题。例如,主机可能需要有一个hot_news变量,需要在每个主机页面上显示,甚至是托管wiki的页面。

为此,我计划使用事件系统,并为NewRequest或BeforeRender添加订阅者,并在请求对象内设置所需的变量。

这是正确的做法吗?是否有我想要做的例子?

1 个答案:

答案 0 :(得分:1)

Pyramid的配置机制使模块的客户端可以轻松覆盖配置。与其他流行的Web框架相比,这是Pyramid最强大的部分之一。

config.include()是解决问题的好方法。它允许调用者覆盖include中定义的任何内容。

可以使用config.override_assets()覆盖资产。

共享用户信息要求您的模块提供用户信息或定义某人可以遵守的合同,允许他们覆盖您的模型。

无论如何,这显然是一个很大的话题。在金字塔顶部编写的高度模块化应用程序包括physicald,kotti,ptah,bookie等。