Как я могу использовать наследование в шаблонах Cheetah?

1

Для 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.

Но как все идет? Или наследование возможно только с предварительно скомпилированными шаблонами гепарда?

Теги:
templates
inheritance
cheetah

1 ответ

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. Subvert Python import, чтобы импортировать 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 через несколько месяцев.

  • 0
    Хорошо, круто, спасибо за ваш ответ, PhD. Когда я добавляю строки from Cheetah import ImportHooks и ImportHooks.install() в мой пример выше, это работает. Большой!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню