Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django'中预处理SHPAML;s模板加载器?_Python_Django_Templates_Preprocessor_Shpaml - Fatal编程技术网

Python 在Django'中预处理SHPAML;s模板加载器?

Python 在Django'中预处理SHPAML;s模板加载器?,python,django,templates,preprocessor,shpaml,Python,Django,Templates,Preprocessor,Shpaml,如果Django的模板加载器认为HTML已经过时,那么有没有办法让它通过SHPAML运行它加载的所有模板(即直接或通过扩展/包含) 我知道如何在整个目录中递归调用SHPAML,但我更希望能够按需运行它,这样我就不必每次更改SHPAML源代码时都记得同步HTML 我想从manage.py调用SHPAML也可以(至少对测试服务器是这样),但是能够侵入Django的模板引擎,让它运行通过预处理器加载的每个文件会更好。我怀疑通过继承(或使用任何加载程序)可以实现您想要的功能以及覆盖load\u temp

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

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


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

我怀疑通过继承(或使用任何加载程序)可以实现您想要的功能以及覆盖
load\u template\u 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中
模板加载程序
元组的开头。当然,每次加载模板时,您都会进行从SHPAML到HTML的转换,因此您可能会看到一些开销。即将发布的Django 1.2以模板缓存为特色,这有助于减少开销


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

刚刚根据Piquard答案中的代码片段创建了一个项目。它的功能更加完整,支持django 1.1和1.2(可能也支持1.0)


我想它可能会在未来派上用场:)

这不是我所希望的,但已经很接近了。特别是,它对缓存问题没有帮助(只有在源文件发生更改时才应预处理模板,否则应加载预处理的文件,而不是SHPAML源文件)。不过,这可能是朝着正确的方向迈出的一步。我发现这是为了向
manage.py
:添加命令——遗憾的是,这对“随需应变”部分没有帮助。