【问题标题】:Preprocess SHPAML in Django's template loader?在 Django 的模板加载器中预处理 SHPAML?
【发布时间】:2010-01-25 08:29:57
【问题描述】:

如果 Django 的模板加载器发现 HTML 已过期,有什么方法可以让 Django 的模板加载器运行它通过 SHPAML 加载的所有模板(即直接或通过扩展/包含)?

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

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

【问题讨论】:

标签: python django templates preprocessor shpaml


【解决方案1】:

我怀疑您可以通过继承 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 具有模板缓存功能,可以帮助减轻这种开销...

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

【讨论】:

  • 这不是我所希望的,但它非常接近。特别是它对缓存问题没有帮助(只有在源文件发生更改时才应预处理模板,否则应加载预处理文件,而不是 SHPAML 源)。不过,这可能是朝着正确方向迈出的一步。
【解决方案2】:

刚刚根据 piquadrat 的回答中的 sn-p 创建了一个项目。它的功能更完整,支持 django 1.1 和 1.2(可能也是 1.0)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 2010-11-11
    • 2015-09-21
    • 2015-09-23
    • 2018-05-26
    • 2011-01-15
    • 2011-10-04
    • 2017-04-20
    相关资源
    最近更新 更多