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

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
4

2 に答える 2

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 に答える
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 に答える