Как использовать наследование в шаблонах Cheetah?
Для Cheetah3 есть очень грубая документация о функции наследования: http://cheetahtemplate.org/users_guide/inheritanceEtc.html
Но я не понимаю, как заставить это работать на самом деле.
Давайте предположим, что у меня есть два файла шаблона:
A.tmpl
#def message
Hello Cheetah
#end def
This is an example: $message
B.tmpl
#extends A
#def message
Hello Cheetah with Inheritance
#end def
и простая программа драйвера, такая как:
from Cheetah.Template import Template
t = Template(file='B.tmpl')
print t
Очевидно, что это не работает, потому что при выполнении этого кода нет класса А.
Но как дела? Или наследование возможно только с предварительно скомпилированными шаблонами Cheetah?
1 ответ
Есть два способа импортировать один шаблон из другого.
- Скомпилируйте все шаблоны в
*.py
файлы, использующиеcheetah compile
программа командной строки. Затем импорт работает на уровне Python.
Для полуавтоматической компиляции всех шаблонов после их редактирования я рекомендую следующее Makefile
(Аромат GNU):
.SUFFIXES: # Clear the suffix list
.SUFFIXES: .py .tmpl
%.py: %.tmpl
cheetah compile --nobackup $<
python -m compile $@
templates = $(shell echo *.tmpl)
modules = $(patsubst %.tmpl,%.py,$(templates))
.PHONY: all
all: $(modules)
(Не забывайте, что для make-файлов необходим отступ с табуляцией, а не с пробелами.)
- Неверный импорт Python, чтобы импортировать Cheetah напрямую из
*.tmpl
файлы.
Код:
from Cheetah import ImportHooks
ImportHooks.install()
import sys
sys.path.insert(0, 'path/to/template_dir') # or sys.path.append
PS. ImportHooks автоматически пытается импортировать из *.pyc
, *.py
а также *.tmpl
- что бы ни было найдено первым. Несколько дней назад я расширил ImportHooks для автоматической компиляции *.tmpl
в *.py
а также *.pyc
, Я собираюсь написать больше документов и нажать через несколько дней. Ожидайте окончательный выпуск Cheetah 3.2 через несколько месяцев.