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

时间:2010-01-25 08:29:58

标签: python django templates preprocessor shpaml

有没有办法让Django的模板加载器运行它加载的所有模板(即直接或通过扩展/包含)通过SHPAML,如果它认为HTML已过期?

我知道如何在整个目录上递归调用SHPAML,但我希望能够按需运行它,所以每次更改SHPAML源时我都不必记住同步HTML。

我想从manage.py调用SHPAML也会起作用(至少对于测试服务器而言),但能够入侵Django的模板引擎并使其运行通过预处理器加载的每个文件都会更好。

2 个答案:

答案 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

然后将您的加载程序放在settings.py中TEMPLATE_LOADERS元组的开头。当然,每次加载模板时,您都将进行SHPAML到HTML舞蹈,因此您可能会看到一些开销。即将推出的Django 1.2具有模板缓存功能,可以帮助减轻开销......

免责声明:此代码完全未经测试,抱歉。

答案 1 :(得分:1)

刚刚在piquadrat的答案中创建了一个基于片段的项目。这是一个更完整的功能,支持django 1.1和1.2(也可能是1.0)

认为它可能会为未来派上用场:)