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.
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:
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
py-eval, eccetto che è usato come attributo a tag HTML. Ecco il suo uso:
<td py-attr="'red'" bgColor="">
<td bgColor="red">
<td bgColor="<py-eval="'red'">">
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">
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>
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>
for in Python. La sintassi è la seguente:
<py-for="i in range(10)">
<py-eval="i">
</py-for>
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>
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>
<b>1</b> 5 3 2 5 4 <u>5</u>
Nella prossima sezione vedremo come usare tutti questi tag 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="'
'+color+' '"></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="">
<a href="http://localhost:8000/webColors">
Nel prossimo capitolo, impareremo come e dove usare view e function ...
See About this document... for information on suggesting changes.