テンプレートエンジンとしてMakoを使用したcherrypyを使用しています。
Makoに、要求されているアプリに基づいてさまざまなディレクトリを検索してもらいたい。
つまり、サイト、管理者、インストールの3つの「アプリ」があります。
それらはすべて独自のテンプレートフォルダを持っており、構造は次のようになります。
- /レンプレート
- / template / site
- / template / admin
- / template / install
- / template / system
/ systemには、404ページなどのシステム全体のテンプレートが含まれています。
Cherrypy / makoを理解しようとしている間、Twiselessを参照として使用していますが、これを行う方法に固執しています。
私がこれをどのように試みたかの簡単な概要を読んでください、しかし警告:私はこれについて完全に間違った方法で行っていると思います!:)それで、もしあなたが何かアイデア/ポインターを持っているなら、これ以上読む手間を省くのは良い考えかもしれません。
メインファイルserver.pyで、次のようにします。
from libs.plugins.template import MakoTemplatePlugin
engine = cherrypy.engine
makoTemplate = MakoTemplatePlugin(engine, self.base_dir)
setTemplateDirs(makoTemplate, self.template_path)
MakoTemplatePluginは、上記のリンクにあるTwiselessにある同じ名前のプラグインのわずかに変更されたバージョンです。
このコードは、グローバル構成ファイルのデフォルトのテンプレートディレクトリを使用するようにTemplateLookupを設定します。すなわち
- /レンプレート
- / template / system
次に、アプリが読み込まれるたびに、関数(setTemplateDirs)を呼び出して、Makoが検索するディレクトリを更新します。
これでうまくいくと思いましたが、うまくいきません。最初は、アプリごとにMakoTemplatePluginの新しいインスタンスを作成するというエラーを犯しました。これにより、インスタンス化された最初のページから始めて、アプリ固有ではない基本的なディレクトリのみを含む、すべてのページの読み込み時にすべてが呼び出されるようになりました。
これが最初に呼び出されたとき、間違ったフォルダを検索していたため、404エラーがトリガーされていました。
代わりに、MakeTemplatePluginへの参照をすべてのアプリに渡すようにしました。setTemplateDirs
各アプリが呼び出されるたびに実行すると、問題は解決すると思いましたが、そうではありません。
関数をどこに置くかわからないので、ページが要求されるたびに実行されます...
例えば
# /apps/site/app.py
import somemodule.setTemplateDirs
class Site(object, params):
def __init__(self):
self.params = params
self.makoTemplate = params['makoTemplate']
self.base_path = params['base_path']
setTemplateDirs(self.makoTemplate, self.base_path, '', '/')
@cherrypy.expose
@cherrypy.tools.render(template='index.html')
def index(self):
pass
これは明らかに、アプリケーションが最初にロードされたときに機能します... update関数呼び出しを別のメソッドに移動して、update
ページごとに呼び出してみました。例:
@cherrypy.exposed
@cherrypy.tools.render(template='index.html')
@update
def index(self):
pass
しかし、これは私に設定関連のエラーを与えるだけです。
これをいじり続けるのではなく、もっと簡単な方法が必要です。
どうしますか?
どうもありがとう、
トム