如何在Pyramid中更换模板引擎?

2 投票
3 回答
1418 浏览
提问于 2025-04-17 06:30

我特别想使用pystache这个模板引擎,不过其他模板引擎的设置指南也可以用。

如果我理解得没错,我需要在我的pyramid应用的__init__.py文件中注册渲染器工厂。

config = Configurator(settings=settings)
config.add_renderer(None, 'pystache_renderer_factory')

现在我需要创建这个渲染器工厂,但我不知道该怎么做。

虽然我找到了关于如何添加模板引擎的文档,但我还是没能成功设置。

3 个回答

2

请注意,这个回答在你创建Pyramid项目之前是很有效的。但是一旦你用脚手架创建了项目,下面这个相关的回答会在构建你的Pystache/Mustache_Renderer_Factory时更有帮助:如何将pystache与pyramid整合?

2

add_renderer的第二个参数应该是一个实现了“添加新渲染器”中所示接口的类。Pyramid会尝试导入pystache_renderer_factory,所以在你的代码中,import pystache_renderer_factory这一行必须能正常工作。不过,这个例子永远不会解析成一个类,只会是一个模块或包,所以你需要先解决这个问题。它应该像这样:mypackage.pystache_renderer_factory

学习如何编写渲染器的最好方法,可能是看看已经写好的渲染器。特别是pyramid_jinja2这个包,或者在Pyramid的源代码中,有非常简单的jsonjsonp渲染器的实现。注意它们都提供了相对独特的方式来实现所需的接口。每个工厂都会接受一个info对象,并返回一个可以接受valuesystem对象的可调用对象。

https://github.com/Pylons/pyramid_jinja2/blob/master/pyramid_jinja2/init.py#L260

https://github.com/Pylons/pyramid/blob/master/pyramid/renderers.py#L135

5

最后,我按照这个指南成功添加了pystache模板引擎:

https://groups.google.com/forum/#!searchin/pylons-discuss/add_renderer/pylons-discuss/Y4MoKwWKiUA/cyqldA-vHjkJ

我做了以下几步:

创建了一个文件,叫mustacherenderer.py:

from pyramid.asset import abspath_from_asset_spec 
import pystache
import os 

def pystache_renderer_factory(info):
    template = os.path.join(abspath_from_asset_spec('myproj:templates', False),
                            info.name)
    f = open(template) 
    s = f.read() 
    f.close() 
    def _render(value, system):
        return pystache.render(s, value)
    return _render

然后把这些内容添加到__init__.py文件里:

config.add_renderer('.pmt', 'myproj.mustacherenderer.pystache_renderer_factory')

现在一切正常运作了 :)

撰写回答