在Django模板加载器中预处理SHPAML吗?
有没有办法让Django的模板加载器在加载所有模板时(比如直接加载或通过扩展/包含加载)检查一下HTML是否过时,然后通过SHPAML处理一下?
我知道怎么对整个目录递归地调用SHPAML,但我更希望能按需运行,这样我就不用每次更改SHPAML源文件时都记得同步HTML了。
我想从manage.py调用SHPAML也可以(至少对测试服务器来说),不过如果能直接修改Django的模板引擎,让它在加载每个文件时都通过一个预处理器来处理,那就更好了。
2 个回答
1
我刚刚根据piquadrat的回答创建了一个项目。这个项目功能更完整,支持django 1.1和1.2(可能也支持1.0)
觉得这个项目将来可能会派上用场 :)
3
我觉得你可以通过从 django.template.loaders.app_directories.Loader
(或者你用的其他加载器)继承来实现你想要的功能,然后重写 load_template_source
方法,比如:
from django.template.loaders.app_directories import Loader
from shpaml import convert_text
class SHPAMLLoader(Loader):
def load_template_source(self, *args, **kwargs):
shpaml_source = super(SHPAMLLoader, self).load_template_source(*args, **kwargs)
html = convert_text(shpaml_source)
return html
接着把你的加载器放在 TEMPLATE_LOADERS
这个元组的最前面,放在你的 settings.py 文件里。当然,每次加载模板的时候,你都要进行 SHPAML 到 HTML 的转换,所以可能会有一些性能开销。即将发布的 Django 1.2 版本会有模板缓存功能,这可能会帮助减少这种开销……
免责声明:这段代码完全没有经过测试,抱歉。