Subsections

5. I linguaggi di template: CHTL e CGTL

CherryPy possiede DUE linguaggi di template. Sono molto simili, ma sono usati in situazioni differenti. Sono stati pensati per essere facili da usare ma nello stesso tempo, molto potenti.

5.1 Tag

Entrambi i linguaggi usano solo 6 tag: py-eval, py-attr, py-exec, py-code, py-if (con py-else) e py-for.

Tutti i tag sono usati nello stesso modo: CherryPyTag="Codice Python". Per esempio:

py-eval="2*2"
py-exec="a=1"
py-if="2==0"
py-for="i in range(10)"
...

Se volete usare le virgolette all'interno del codice python, avrete bisogno di usare il carattere di escape (backslash), in questo modo:

py-eval="'I love \"cherry pies\"'"

Vediamo cosa da ognuno di questi tag:

5.1.1 py-eval

Questo tag è usato per valutare un espressione Python, come in questo caso:
Hello, the sum is <py-eval="1+2+3">

Questa linea verrà visualizzata come:

Hello, the sum is 6

Quello che succede è che CherryPy prima valuta l'espressione (usando eval) e quindi usa str per convertire il risultato in una stringa.

Tutti i tag CGTL possono essere racchiusi tra /> o / >, come in questo caso:

<py-eval="'abcd' * 2" />
<py-eval="'Hello, %s' % name"/>

Nel formato CHTL, il tag py-eval può essere usato all'interno di qualsiasi coppia di tag (sia di apertura che di chiusura), come in questo caso:

<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>
...

Se non volete che nessun tag HTML preceda o segua l'espressione, il trucco è di usare il tag HTML <div>:

This is a long string with a <div py-eval="'variable'"></div> in it

5.1.2 py-attr

Questo tag e' simile a py-eval, eccetto che è usato come attributo a tag HTML. Ecco il suo uso:
<td py-attr="'red'" bgColor="">
E che darà come risultato:
<td bgColor="red">
Notate che questo è equivalente a:
<td bgColor="<py-eval="'red'">">
Ma la prima sintassi è preferibile.

5.1.3 py-exec e py-code

Questi tag sono usati per eseguire codice Python. py-exec è usato per eseguire una linea di codice Python mentre py-code è usato per eseguire blocchi di codice Python. Per esempio, il codice che segue:
<py-exec="a=2">
<py-code="
    if a==2:
        b=1
    else:
        b==2
">
b equals <py-eval="b">
Sarà visualizzato come:
b equals 1

Usando la sintassi CHTL, entrambi i tag dovranno essere racchiusi tra i tag <div> e </div> come segue:

<div py-exec="a=2"></div>
<div py-code="
    if a==2:
        b=1
    else:
        b=2
"></div>

Se volete visualizzare dei dati all'interno del codice Python, dovrete appenderli alla variabile _page:

<html><body>
    Integers from 0 to 9:
    <py-code="
        for i in range(10):
            _page.append("%s "%i)
    ">
</body></html>

Che sarà visualizzato come:

<html><body>
    Integers from 0 to 9:
    0 1 2 3 4 5 6 7 8 9
</body></html>

5.1.4 py-if e py-else

Questi tag sono usati come if ed else in Python. La sintassi è la seguente:
<py-if="1==1">
    OK
</py-if><py-else>
    Not OK
</py-else>

Che sarà visualizzato come

OK

Notate che se c'è una clausola else, il tag <div py-else> deve seguire il tag </div> che chiude il tag <div py-if>, con nessun carattere significativo tra di loro (sono permessi solo separatori).

Il CHTL equivalente è:

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

5.1.5 py-for

Anche questo tag è uguale al for in Python. La sintassi è la seguente:
<py-for="i in range(10)">
    <py-eval="i">
</py-for>
Che sarà visualizzato come
0 1 2 3 4 5 6 7 8 9

Notate che potete ciclare su liste di tuple:

<py-for="i,j in [(0,0), (0,1), (1,0), (1,1)]">
    <py-eval="i+j">
</py-for>
La cui visualizzazione sarà
0 1 1 2

Il CGTL equivalente è:

<div py-for="i,j in [(0,0), (0,1), (1,0), (1,1)]">
    <div py-eval="i+j"></div>
</div>

In un ciclo py-for, CherryPy crea due variabili speciali: _index and _end. La prima è un intero contenente il numero corrente di iterazioni (da 0 a n-1). La seconda contiene il numero totale di iterazioni meno 1.

Per esempio, se vogliamo visualizzare una lista con la prima occorrenza in grassetto e l'ultima sottolineata possiamo usare il seguente codice:

<py-exec="myList=[1,5,3,2,5,4,5]">
<py-for="item in myList">
    <py-if="_index==0"><b py-eval="item"></b>
    </py-if><py-else>
        <py-if="_index==_end"><u py-eval="item"></u>
        </py-if><py-else><py-eval="item"></py-else>
        </div>
    </py-else>
</py-for>
Questo sarà il risultato:
<b>1</b> 5 3 2 5 4 <u>5</u>

Nella prossima sezione vedremo come usare tutti questi tag insieme...

5.2 Mettiamo tutto insieme

Ora andremo a creare una pagina web che visualizza una tabella con tutti i colori HTML. Editate il file Hello.cpy e modificatelo nel seguente modo:

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>
            <py-exec="codeList=['00', '33', '66', '99', 'CC', 'FF']">
            <table border=1>
            <py-for="r in codeList">
                <py-for="g in codeList">
                    <tr>
                        <py-for="b in codeList">
                            <py-exec="color='#%s%s%s'%(r,g,b)">
                            <td py-attr="color" bgColor="" py-eval="'&nbsp;&nbsp;
                                                '+color+'&nbsp;'"></td>
                        </py-for>
                    </tr>
                </py-for>
            </py-for>
        </body></html>

Ricompilate il file, fate ripartire il server e ricaricate la pagina nel vostro browser. Cliccate sul link e dovreste vedere una simpatica tabella con tutti i colori del web.

Come funziona?

Il metodo webColors è un esempio di un uso diretto e semplice dei tag CHTL. La riga più interessante è:

<a py-attr="request.base+'/webColors'" href="">

request è una variabile globale usata da CherryPy per ogni richiesta di un client. E' un'instanza di una classe con diverse variabili. Una di queste è chiamata base e contiene l'URL di base del sito web (nel nostro caso: http://localhost:8000). Così, la linea

<a py-attr="request.base+'/webColors'" href="">
sarà resa come:
<a href="http://localhost:8000/webColors">
Questo ci dice anche che quando il browser richiede l'URL http://localhost:8000/webColors, verrà chiamato il metodo webColors della classe Root.

Nel prossimo capitolo, impareremo come e dove usare view e function ...

See About this document... for information on suggesting changes.