在Django模板加载器中预处理SHPAML吗?

3 投票
2 回答
599 浏览
提问于 2025-04-15 18:26

有没有办法让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 版本会有模板缓存功能,这可能会帮助减少这种开销……

免责声明:这段代码完全没有经过测试,抱歉。

撰写回答