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の使い方、およびどういう時に使うかを学ぶことにします。