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.