Гепард с Cherrypy: как загрузить базовые шаблоны и сделать это автоматически при изменении во время разработки
Я работаю над приложением cherrypy+cheetah и хотел бы улучшить опыт разработки.
У меня все работает, когда я вручную компилирую шаблоны. (Обновление: Вот как все работает для производства: прекомпилируйте, не отправляйте *.tmpl и загружайте шаблоны как обычные модули Python.) Однако во время разработки я бы предпочел просто загружать шаблоны каждый раз, когда на них ссылаются, чтобы я не не нужно убивать и перезапускать мое приложение. У меня есть пара вопросов, с которыми я сталкиваюсь:
- Если у меня есть шаблоны, унаследованные от базовых шаблонов, я получаю ошибки импорта (не могу найти базовые шаблоны). Я думаю, что это действительно работало во время моих экспериментов, но, к сожалению, не спасло это, и теперь я не могу заставить это работать.
- Предположим, у меня 1. работает, как сделать так, чтобы изменения даже в базовых шаблонах брались без перезапуска.
Ниже приведен пример приложения, которое должно продемонстрировать проблемы. Структура каталогов выглядит следующим образом:
t.py
templates/
base.tmpl
index.tmpl
t.py:
import sys
import cherrypy
from Cheetah.Template import Template
class T:
def __init__(self, foo):
self.foo = foo
@cherrypy.expose
def index(self):
return Template(file='templates/index.tmpl',
searchList=[{'foo': self.foo}]).respond()
cherrypy.quickstart(T(sys.argv[1]))
base.tmpl:
#def body
This is the body from the base
#end def
This is the base doc
index.tmpl:
#from templates.base import base
#extends base
#def body
$base.body(self)
This is the extended body
#end def
This is from index
Запустите это так:
python t.py Something
2 ответа
Похоже, что этот вопрос был своего рода ответ в другом вопросе SO. Используя функцию cheetah_import, я могу написать свои методы так:
@cherrypy.expose
def index(self):
templates = cheetah_import('templates.index')
t = getattr(getattr(templates, 'index'), 'index')(searchList=[{'foo': self.foo}])
return t.respond()
Мне также нужно будет добавить __init__.py
в каталог шаблонов. Этот подход также требует, чтобы Cherrypy engine.autoreload_on
настройка установлена на True
,
Чтобы сделать производство более эффективным, я могу сделать cheetah_import = __import__
и не заменить по умолчанию __builtin__.import
,
Попробуй это:
замещать base.tmpl
с:
#from Cheetah.Template import Template
#def body
#set $base = Template(file="templates/base.tmpl")
$base.body()
<br/>
This is the extended body
#end def
$body()
<br/>
This is from index