Subsections

テンプレート言語: CHTLとCGTL

CherryPyには2つのテンプレート言語が付属しています。これらはお互いとても似ていますが、それぞれ異なるシチュエーションで使われます。これらはとても使いやすく、そしてパワフルであるようにデザインされています。

タグ

どちらの言語も6つのタグしか使いません: py-eval, py-attr, py-exec, py-code, py-if (とpy-else), そしてpy-forです。

全てのタグは同じ使われ方をします: 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)を使ってください。

これらの各タグがどのように使われるのかみていきましょう

py-eval

このタグはPythonの式を評価するために使われます。CHTLフォーム内では、HTMLタグに以下の様にして埋め込まれます:
<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>

py-attr

このタグはpy-evalのようなものですが、HTMLタグの属性を使うという点が違います。これは以下のような使われ方をします:
<td py-attr="'red'" bgColor="">
これは以下の表示になります
<td bgColor="red">
これは以下と同じ意味であることに注意してください:
<td bgColor="<py-eval="'red'">">
しかし最初の文の方が好まれるでしょう。

py-execとpy-code

これらのタグはPythonコードを実行するのに使われます。py-execはPythonのワンライナーのコードを実行するために使われ、py-codeは複数行のPythonコードを実行するために使われます。CHTLの文法では、両方のタグは<div>と</div>タグ内に埋め込まれます。以下に示します:
<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")となります。

py-ifとpy-else

これらのタグはPythonのifelseのように使われます。この文法は以下の通りです:
<div py-if="1==1">
    OK
</div>
<div py-else>
    Not OK
</div>
これは以下のように表示されます
OK
else節がある場合、<div py-else>タグは、<div py-if>タグを閉じる</div>タグの後(すぐ直後です。改行などのセパレータを除く何らかの文字をはさむことはできません)に続く必要があります。

CGTLでは以下の感じになります:

<py-if="1==1">
    OK
</py-if>
<py-else>
    Not OK
</py-else>

py-for

このタグはPythonのforのように使います。この文法は以下の通りです:
<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="'&nbsp;&nbsp;'+color+'&nbsp;'"><
/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の使い方、およびどういう時に使うかを学ぶことにします。



Debian User 2003-10-13