リソーステンプレートの適用
今のところ、デモの目的として、内部リクエストにくるのはすべてプレーンテキストを返していました。
これからどのように実物のテンプレートをコントローラーの中に埋め込むのかを見せましょう。
TurboGearsユーザは、マークアップの中の動的コンテンツをコントロールするためにKidテンプレートシステムが利用できます。
あなたのサイトのページ毎に、テンプレートコントローラの中でリソース対応が起こります。
これは特定のテンプレートの引数(turbogears.expose デコレータの引数)で行われます。
@turbogears.expose(template="tutorial.templates.welcome") def index(self): ...
テンプレートは置き換える引数を取ります。テンプレート引数は、変数とほかの動的コンテンツに利用されます。コントローラーからのテンプレート引数は、テンプレート内でアクセス可能な変数(辞書キー)として返すことができます。
@turbogears.expose(template="tutorial.templates.users") def index(self): users = model.User.select() return dict(users=users)
すべてのテンプレートが動的コンテンツを持っているとは限りません。それ故、引数が必要でないかもしれません。
このケースでは、空の辞書が返ります。
@turbogears.expose(template="tutorial.templates.welcome") def index(self): return dict()
ここでは、アプリケーションのためにコントローラー修正をします。プレーンテキストの代わりにテンプレートを利用します。
class Users: @turbogears.expose(template="tutorial.templates.users") def index(self): users = model.User.select() return dict(users=users) @turbogears.expose(template="tutorial.templates.user") def default(self, userID): try: userID = int(userID) user = model.User.get(userID) except (ValueError, model.SQLObjectNotFound): raise cherrypy.NotFound else: return dict(user=user) class Root(controllers.RootController): users = Users() @turbogears.expose(template="tutorial.templates.welcome") def index(self): return dict() @turbogears.expose(template="tutorial.templates.about") def about(self, author="Brian Beck"): return dict(author=author)
個人的メモ1
当然だけど、UsersクラスをRootクラスの前に書く必要がある。def defaultは適合するメソッド・アトリビュートが該当しなかった場合に呼び出される処理。URLを引数として持つ。例えばhttp://www.example.co.jp/Users/3 はdefaultの第2引数に"3"が入る。
このアプリケーションにアクセスしても、今は動きません。まだいくつかのテンプレートが存在していないし、作成されていないからです。
テンプレートの骨組みを作成します。プロジェクトが作られた時にできたデフォルトのwelcom.kidをコピーして作成します。
$ cp tutorial/templates/welcome.kid tutorial/templates/users.kid $ cp tutorial/templates/welcome.kid tutorial/templates/user.kid $ cp tutorial/templates/welcome.kid tutorial/templates/about.kid