Cheetah с Cherrypy: как загружать базовые шаблоны и делать это автоматически при изменении во время разработки

Я работаю над приложением cherrypy+cheetah и хотел бы улучшить процесс разработки.

У меня все работает, когда я заранее вручную компилирую шаблоны. (Обновление: вот как все работает для производства: предварительно скомпилируйте, не отправляйте *.tmpl и загружайте шаблоны как обычные модули Python.) Однако во время разработки я бы предпочел просто загружать шаблоны каждый раз, когда на них ссылаются, чтобы я не не нужно убивать и перезапускать мое приложение. У меня есть пара проблем, с которыми я сталкиваюсь:

  1. Если у меня есть шаблоны, наследуемые от базовых шаблонов, я получаю ошибки импорта (не могу найти базовые шаблоны). Я думаю, что это действительно работало во время моих экспериментов, но, к сожалению, я не сохранил его, и теперь я не могу заставить его работать.
  2. Предположим, у меня 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

person Heikki Toivonen    schedule 31.03.2010    source источник


Ответы (2)


Попробуй это:

Замените 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
person Vijayendra Bapte    schedule 31.03.2010
comment
Это работает для разработки, но ломается в производстве. Для производства шаблоны предварительно компилируются и используются путем импорта их как обычных модулей Python. В производстве не будет файлов *.tmpl. - person Heikki Toivonen; 31.03.2010

Похоже, на этот вопрос был дан ответ в другом вопросе 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 по умолчанию.

person Heikki Toivonen    schedule 31.03.2010