我正在开发一个维基引擎。由于这个应用程序本身是有用的(至少对于我公司的私人使用),它应该能够作为一个独立的金字塔应用程序运行,具有自己的图形主题。然而,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 添加订阅者,并在请求对象中设置所需的变量。
这是正确的方法吗?有没有我正在尝试做的例子?