关于Mako模块、Mako的TemplateLookup函数和Pyramid的一些问题
我在看Mako的文档时,发现了一个叫TemplateLookup的功能,具体可以查看这个链接:使用TemplateLookup。不过我在Pyramid的文档里从没见过这个,因为我从来没有需要指定模块目录。我的问题是:
- 这里提到的“模块”是什么?它们是像预编译的.pyc文件那样的吗?
- 使用TemplateLookup和Pyramid的render()或render_to_response()相比,模板的加载速度会更快吗?
- Pyramid默认会创建这些模块吗?如果会,那它们是隐藏起来用户看不见的?
- 文档里说这些模块是缓存到内存中的。这和通过Beaker进行缓存有什么不同?
因为我网站上的内容都是动态的(除了基本的页脚),我想找出缓存模板或加快渲染的最佳方法。如果这个方法真的能加快渲染,那就太好了。
2 个回答
关于前面三个问题,可以看看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
以下是对你问题的一些回答:
对于你每一个模板,都会生成一个Python模块(
.py
文件),里面包含了渲染这个模板所需的代码。这其实是模板的一个优化版本,可以更方便地在Python中执行。当这个模块被执行时,还会生成一个.pyc
文件。你可以通过下面的实验来验证这一点:from mako.template import Template Template(filename='template.mako', module_directory='.')
假设存在一个
template.mako
文件,你会看到生成了template.mako.py
和template.mako.pyc
这两个文件。在查看
pyramid.mako_templating.MakoLookupRenderer.__call__
时,我发现用于在Pyramid中渲染mako模板的方法已经使用了一个TemplateLookup
对象,所以不会有任何区别。在
pyramid.mako_templating.renderer_factory
中,我看到有一个设置叫mako.module_directory
。这个设置和其他类似的设置可以用来控制mako
库的行为,以创建模块文件。看起来默认情况下是不会创建这些文件的(mako.module_directory
默认是None
),但你当然可以根据需要进行调整。在
TemplateLookup
中,我看到有一个参数叫cache_impl
,默认设置为beaker
,所以我猜没有什么区别。