关于Mako模块、Mako的TemplateLookup函数和Pyramid的一些问题

7 投票
2 回答
1496 浏览
提问于 2025-04-17 11:12

我在看Mako的文档时,发现了一个叫TemplateLookup的功能,具体可以查看这个链接:使用TemplateLookup。不过我在Pyramid的文档里从没见过这个,因为我从来没有需要指定模块目录。我的问题是:

  1. 这里提到的“模块”是什么?它们是像预编译的.pyc文件那样的吗?
  2. 使用TemplateLookup和Pyramid的render()或render_to_response()相比,模板的加载速度会更快吗?
  3. Pyramid默认会创建这些模块吗?如果会,那它们是隐藏起来用户看不见的?
  4. 文档里说这些模块是缓存到内存中的。这和通过Beaker进行缓存有什么不同?

因为我网站上的内容都是动态的(除了基本的页脚),我想找出缓存模板或加快渲染的最佳方法。如果这个方法真的能加快渲染,那就太好了。

2 个回答

3

关于前面三个问题,可以看看jcollado的回答。至于第四个问题:

根据文档的说法,这些模块是保存在内存中的缓存。这和通过Beaker缓存有什么不同呢?

这两者缓存的东西不一样。Beaker(或者你在 cache_impl 中设置的任何东西)缓存的是已经渲染的输出。如果你设置了 module_directory,那么从mako文件编译的Python模块会保存在这里。用图示可能更容易理解:

                                                    context variables
                                                            |
                                                            v
              Template()                                 render()
.mako file  ------------->  python module (.py, .pyc)  ----------->  output
                                       :                                :
                                       |                                |
                                   cached in                         cached
                               module_directory                    via Beaker
5

以下是对你问题的一些回答:

  1. 对于你每一个模板,都会生成一个Python模块(.py文件),里面包含了渲染这个模板所需的代码。这其实是模板的一个优化版本,可以更方便地在Python中执行。当这个模块被执行时,还会生成一个.pyc文件。你可以通过下面的实验来验证这一点:

    from mako.template import Template
    Template(filename='template.mako', module_directory='.')
    

    假设存在一个template.mako文件,你会看到生成了template.mako.pytemplate.mako.pyc这两个文件。

  2. 在查看pyramid.mako_templating.MakoLookupRenderer.__call__时,我发现用于在Pyramid中渲染mako模板的方法已经使用了一个TemplateLookup对象,所以不会有任何区别。

  3. pyramid.mako_templating.renderer_factory中,我看到有一个设置叫mako.module_directory。这个设置和其他类似的设置可以用来控制mako库的行为,以创建模块文件。看起来默认情况下是不会创建这些文件的(mako.module_directory默认是None),但你当然可以根据需要进行调整。

  4. TemplateLookup中,我看到有一个参数叫cache_impl,默认设置为beaker,所以我猜没有什么区别。

撰写回答