Предварительная обработка SHPAML в загрузчике шаблонов Django? - PullRequest
3 голосов
/ 25 января 2010

Есть ли способ заставить загрузчик шаблонов Django запускать все шаблоны, которые он загружает (то есть напрямую или через расширение / включение) через SHPAML, если он считает, что HTML устарел?

Я знаю, как рекурсивно вызывать SHPAML по всему каталогу, но я бы предпочел иметь возможность запускать его по требованию, поэтому мне не нужно помнить о синхронизации HTML каждый раз, когда я меняю источник SHPAML.

Полагаю, что вызов SHPAML из manage.py тоже будет работать (по крайней мере, для тестовых серверов), но возможность взломать движок шаблонов Django и заставить его запускать каждый файл, загружаемый через препроцессор, будет лучше.

Ответы [ 2 ]

3 голосов
/ 25 января 2010

Я подозреваю, что вы можете достичь того, что хотите, унаследовав от 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 будет реализовано кэширование шаблонов, которое может помочь уменьшить эти издержки ...

Отказ от ответственности: этот код полностью не проверен, извините.

1 голос
/ 20 мая 2010

Только что создал проект, основанный на фрагменте в ответе Пиквадрата. Это немного более полный набор функций и поддерживает django 1.1 и 1.2 (возможно, также 1.0)

Думал, что это может пригодиться в будущем:)

...