Для Cheetah3 существует очень грубая документация по наследованию: http://cheetahtemplate.org/users_guide/inheritanceEtc.html#extends
Но я не понимаю, как заставить его работать на самом деле.
Предположим, у меня есть два файла шаблона:
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
Очевидно, что это не работает, потому что при выполнении этого кода нет класса A.
Но как все идет? Или наследование возможно только с предварительно скомпилированными шаблонами гепарда?
Есть два способа импортировать один шаблон из другого.
*.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 файлы требуют отступа с вкладками, а не пробелами).
*.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 через несколько месяцев.
from Cheetah import ImportHooks
иImportHooks.install()
в мой пример выше, это работает. Большой!