CherryPyには2つのテンプレート言語が付属しています。これらはお互いとても似ていますが、それぞれ異なるシチュエーションで使われます。これらはとても使いやすく、そしてパワフルであるようにデザインされています。
全てのタグは同じ使われ方をします: CherryPyTag="Some Python code"です。たとえば:
py-eval="2*2" py-exec="a=1" py-if="2==0" py-for="i in range(10)" ...
注意すべきことは、Pythonコード内ではダブルクォートを(直前にバックスラッシュを入れても)使うことはできません。もし文字列内でダブルクォートを挿入する必要があれば、chr(34)を使ってください。
これらの各タグがどのように使われるのかみていきましょう
<b py-eval="2*2">これは2*2の計算結果に置き換わります</b>これは以下のように表示されます:
<b>4</b>py-evalタグは開いて閉じるHTMLタグの全てで使う事ができます:
<span class=myClass py-eval="2*3"></span> <a href="myHref" py-eval="'Click here'"></a> <u py-eval="'I\'m with an underline'"></u> ...
もし式のまわりでHTMLタグを使いたくなければ、<dvi>というHTMLタグを使うトリックがあります:
これは<div py-eval="'variable'"></div>を使っている長い文字列です
CGTLバージョンのタグは、HTMLタグ内に埋め込む必要がないという点以外はCHTLと同じです:
<py-eval="2*2">これは、例えば出力がjavascriptの場合などに実用的です。なぜなら<dvi></dvi>を使う必要がないからです:
<script> for (i=<py-eval="2*2">; i<10; i++) { // なんらかの処理をする } </script>
<td py-attr="'red'" bgColor="">これは以下の表示になります
<td bgColor="red">これは以下と同じ意味であることに注意してください:
<td bgColor="<py-eval="'red'">">しかし最初の文の方が好まれるでしょう。
<div py-exec="a=2"></div> <div py-code=" if a==2: b=1 else: b=2 "></div>
CGTLの場合は以下になります:
<py-exec="a=2"> <py-code=" if a==2: b=1 else: b==2 ">
もしPythonコード内に何らかのデータを表示したい場合、そこに_page変数を付け加えます:
<html><body> Integers from 0 to 9: <div py-code=" for i in range(10): _page.append("%s "%i) "></div> </body></html>
これは以下のように表示されます:
<html><body> Integers from 0 to 9: 0 1 2 3 4 5 6 7 8 9 </body></html>
注意: 0.4より前のバージョンでは、この文法は_pate+="text"でした。バージョン0.4からは、この文法は_page.append("text")となります。
<div py-if="1==1"> OK </div> <div py-else> Not OK </div>これは以下のように表示されます
OKelse節がある場合、<div py-else>タグは、<div py-if>タグを閉じる</div>タグの後(すぐ直後です。改行などのセパレータを除く何らかの文字をはさむことはできません)に続く必要があります。
CGTLでは以下の感じになります:
<py-if="1==1"> OK </py-if> <py-else> Not OK </py-else>
<div py-for="i in range(10)"> <div py-eval="i"></div> </div>これは以下のように表示されます
0 1 2 3 4 5 6 7 8 9
タプルのリスト内をループさせることができます:
<div py-for="i,j in [(0,0), (0,1), (1,0), (1,1)]"> <div py-eval="i+j"></div> </div>これは以下のように表示されます
0 1 1 2
CGTLの場合は以下のようになります:
<py-for="i,j in [(0,0), (0,1), (1,0), (1,1)]"> <py-eval="i+j"> </py-for>
py-forループ内では、CherryPyは便利な2つの特別な変数を用意しました:_indexと_endです。前者は(0からn-1までの)の繰り返しの現在のカウンタの数値が整数で入っています。後者には繰り返す回数から1を引いた数が入っています。
たとえば、もしあなたがあるリストの最初のアイテムにボールドを、そして最後のアイテムにアンダーラインをつけて表示したい場合、以下のようなコードを使う事ができます:
<div py-exec="myList=[1,5,3,2,5,4,5]"></div> <div py-for="item in myList"> <div py-if="_index==0"><b><div py-eval="item"></div></b> </div><div py-else> <div py-if="_index==_end"><u><div py-eval="item"></div></u> </div><div py-else><div py-eval="item"></div> </div> </div> </div>これは以下のように表示されます:
<b>1</b> 5 3 2 5 4 <u>5</u>
次の節では、これらのタグを全部一緒に使うやり方をみていきましょう。。。
HTML上の全ての色を使ったテーブルを表示するウェブページを作成してみます。ファイルHello.cpyを編集し、以下のように変更します:
CherryClass Root: mask: def index(self): <html><body> <a py-attr="request.base+'/webColors'" href=""> Click here to see a nice table with all web colors </a> </body></html> def webColors(self): <html><body> <div py-exec="codeList=['00', '33', '66', '99', 'CC', 'FF']"></div> <table border=1> <div py-for="r in codeList"> <div py-for="g in codeList"> <tr> <div py-for="b in codeList"> <div py-exec="color='#%s%s%s'%(r,g,b)"></div> <td py-attr="color" bgColor="" py-eval="' '+color+' '">< /td> </div> </tr> </div> </div> </body></html>
ファイルをリコンパイルし、サーバーを再起動してブラウザを更新してください。リンクをクリックするとウェブカラーを全て使ったすてきなテーブルが見えるはずです。
どのように動いているのでしょうか?
webColorsメソッドはCHTLタグのごく普通の使い方をしています。もうちょっとおもしろい行はこれです:
<a py-attr="request.base+'/webColors'" href="">
requestはクライアントの各リクエストのためにCherryPyが用意したグローバル変数です。これはいくつかの変数を伴う一つのクラスのインスタンスです。これらの一つがbaseと呼ばれ、ウェブサイトのベースURLを格納します(今回の場合:http://localhost:8000 )。よって、 以下の、
<a py-attr="request.base+'/webColors'" href="">は以下のように表示されます:
<a href="http://localhost:8000/webColors">このことは、ブラウザがURL http://localhost:8000/webColors をリクエストした時、RootクラスのwebColorsメソッドが呼び出されるということも教えてくれます。
次の章では、view, functionの使い方、およびどういう時に使うかを学ぶことにします。