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

Plugins 使金字塔应用程序为独立和嵌入式模式做好准备,plugins,pyramid,Plugins,Pyramid,我正在开发一个维基引擎。由于这个应用程序本身是有用的(至少对于我公司的私人使用),它应该能够作为一个独立的金字塔应用程序运行,具有自己的图形主题。 不过,wiki功能也可以作为更大项目的一部分使用,我希望能够将其包含到其他金字塔应用程序中 我已经找到了一些金字塔的功能,可以帮助我实现这一点,但首先我不确定这是否是最好的方法,其次一些问题仍然存在 以下是我目前看到的潜在问题: 模板:如何在独立模式和托管模式之间切换 主机变量:事件如果我们可以重用主机模板,则可能需要一些变量来正确呈现模板,但来宾

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

我已经找到了一些金字塔的功能,可以帮助我实现这一点,但首先我不确定这是否是最好的方法,其次一些问题仍然存在

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

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

  • 主机变量:事件如果我们可以重用主机模板,则可能需要一些变量来正确呈现模板,但来宾(wiki引擎)应用程序未设置这些变量

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

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

然后在宿主应用程序中,我在.ini文件中定义了一个变量,该变量指向来宾应该使用的模板文件(即
base\u template=hostapp:templates/wikibase.mako

在来宾应用程序中,
includeme()
方法读取
base\u模板
变量并覆盖一些全局配置

然后,每个来宾视图的工作方式如下:

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添加订阅服务器,并在request对象中设置所需的变量


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

Pyramid的配置机制使模块的客户端很容易覆盖配置。与其他流行的web框架相比,这是金字塔最强大的部分之一

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

可以使用
config.override\u Assets()
覆盖资产

共享用户信息需要您的模块提供用户信息,或者定义一个合同,允许其他人覆盖您的模型


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

金字塔的配置机制使模块的客户端很容易覆盖配置。与其他流行的web框架相比,这是金字塔最强大的部分之一

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

可以使用
config.override\u Assets()
覆盖资产

共享用户信息需要您的模块提供用户信息,或者定义一个合同,允许其他人覆盖您的模型


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

谢谢。如何将变量从主机传递到来宾应用程序。我可以将属性附加到订阅服务器的请求对象中吗?或者有更好的方法吗?
config.add\u request\u method()
谢谢。如何将变量从主机传递到来宾应用程序。我可以将属性附加到订阅服务器的请求对象中,还是有更好的方法?
config.add\u request\u method()