2

我正在开发一个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

索引.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
4

2 回答 2

1

试试这个:

替换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
于 2010-03-31T05:40:01.190 回答
1

看起来这个问题在另一个 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.

于 2010-03-31T16:30:47.887 回答