@expose()
exposeデコレータはCherryPyに対して、特定のメソッドを出力し、トランザクションをサポートしているデータベースへの自動トランザクションサポートをスタートしたりコミットしたりすることを知らせます。
基本的な使用方法
空のexposeデコレータは、そのメソッドをウェブ上で利用可能にすることを意味しますが、コンテンツのフォーマットやヘッダの設定をあなたがすべて制御することになります。
@expose()
より一般的なのはテンプレートへの関連づけを指定することです:
@expose("projectname.templates.baz")
このようにした場合、コントローラメソッドから辞書を返すことが期待されます。この辞書の値はテンプレートで利用可能になります。たいていのテンプレートはキーと値のペアをローカル変数としてexposeします。言い換えれば、 {'a':2} を返せば、テンプレート内ではすべての ${a} が2に置き換わるということになります。
Tip: 値がコントローラメソッドの名前空間にすでにあるならば、 return locals() とすることができます。
上記で ("projectname.templates.baz") としたテンプレートはレンダリングするためにデフォルトのテンプレートエンジンとしてKidを使うでしょう。あるメソッドに対してのみ別のテンプレートエンジンを利用したい場合は、テンプレート指定の前にその名前とコロンを置くだけです:
@expose("cheetah:foo.templates.plaintext")
いくつかのテンプレートエンジンではテンプレートファイルを指定する必要さえないかもしれません。例えばJSONの出力はそのように動きます。このような時は、テンプレートエンジンそのものを書くだけです:
@expose("json")
同じメソッドを異なるテンプレートで
コントローラメソッドが辞書を返すだけであるとき、この辞書を異なるテンプレートエンジンへ渡して、異なる結果を返すようにしたいと考えるかもしれません。これは正しい考えです:
@expose("projectname.templates.baz")
@expose("json", as_format="json", accept_format="text/javascript")
def yourmethod(self):
return dict(a_value="something")
この場合、デフォルトのテンプレート言語を変更しない限り projectname/templates/baz.kid はKidへ渡されます。一方で yourmethod が "tg_format=json" と共に呼び出されたり、あるいは "Accept: text/javascript" ヘッダが存在した場合には、JSONフォーマットのデータが返されるでしょう。
JSONはAjax操作をするのに一般的かつ便利なフォーマットなので、JSON出力を得るための簡単な方法があります:
@expose("foo.templates.baz", allow_json=True)
def yourmethod(self):
return dict(a_value="something")
このサンプルは先ほどのサンプルと同等です。 allow_json=True パラメータを追加することは、先ほどのサンプルの2つめの@exposeデコレータと同じなのです。
もちろんこれはJSON出力に限ったことではありません。HTML出力でKidを使っているときに、cheetahフォーマットテキストを返したいときには以下のようにします:
@expose("cheetah:projectname.templates.plaintext",
as_format="plain", accept_format="text/plain"
content_type="text/plain")
このメソッドが "tg_format=plain" パラメータと共に呼ばれたとき(``as_format``がこれに該当します)や、 "Accept: text/plain" ヘッダが存在したとき(``accept_format``がこれに該当します)には、Cheetahテンプレートが使われ、そのページのプレーンテキストがレンダリングされるでしょう。 content_type を省略すると、このドキュメントは text/html として扱われます。ほとんどのクライアントはMIMEタイプをミスしたテキストをうまく処理できますが、PDFやPNGなどのテキストでない出力を返す場合は正しいMIMEタイプをセットするのがよいでしょう。
Kidのようないくつかのテンプレートエンジンはいくつかのフォーマットでテンプレートをレンダリングすることができます。 format パラメータはそのエンジンがどのフォーマットで出力するかを制御します。Kidではこのオプションは "html" (デフォルト)、 "xml" 、 "xhtml" を採ることができます。

