How to change the template engine in Pyramid?

99封情书 提交于 2019-12-14 03:42:45

问题


In particular I want to use pystache but any guide for another template engine should be good enough to set it up.

If I understood correctly, I have to register the renderer factory in the __init__.py of my pyramid application.

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

Now I need to create the renderer factory and don't know how.

Even though I found the documentation about how to add a template engine, I didn't manage to set it up.


回答1:


Finally I was able to add the pystache template engine following this guide:

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

What I did:

created the file 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

added this to the __init__.py:

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

working :)




回答2:


add_renderer's second argument is supposed to be a class that implements the interface shown in "Adding a New Renderer". Pyramid will take pystache_renderer_factory and attempt to import it, so in your code the line import pystache_renderer_factory would have to work. This example won't ever resolve to a class, only a module or package, so you'll have to fix that first. It should be something like mypackage.pystache_renderer_factory.

The best way to learn how to write a renderer is probably to look at some that have been written already. Specifically the pyramid_jinja2 package, or in Pyramid's source there are very simple implementations of json and jsonp renderers. Notice how they all provide fairly unique ways to implement the required interface. Each factory accepts an info object, and returns a callable that accepts value and system objects.

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

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




回答3:


Note that this answer works well until you create your Pyramid project with a scaffold. Once you do so, this related answer will prove more useful when constructing your Pystache/Mustache_Renderer_Factory: How to integrate pystache with pyramid?.



来源:https://stackoverflow.com/questions/8169606/how-to-change-the-template-engine-in-pyramid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!