Как использовать наследование в шаблонах 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 ответ

Решение

Есть два способа импортировать один шаблон из другого.

  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-файлов необходим отступ с табуляцией, а не с пробелами.)

  1. Неверный импорт 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 через несколько месяцев.

Другие вопросы по тегам