CherryPy - Livello di presentazione

Il livello di presentazione garantisce che la comunicazione che lo attraversa sia indirizzata ai destinatari previsti. CherryPy mantiene il funzionamento del livello di presentazione tramite vari motori di modelli.

Un motore di modelli prende l'input della pagina con l'aiuto della logica aziendale e quindi lo elabora alla pagina finale che si rivolge solo al pubblico previsto.

Kid - Il motore dei modelli

Kid è un semplice motore di template che include il nome del template da elaborare (che è obbligatorio) e l'inserimento dei dati da passare al momento del rendering del template.

Alla creazione del modello per la prima volta, Kid crea un modulo Python che può essere servito come versione cache del modello.

Il kid.Template restituisce un'istanza della classe template che può essere utilizzata per eseguire il rendering del contenuto di output.

La classe template fornisce il seguente set di comandi:

S.No Comando e descrizione
1.

serialize

Restituisce il contenuto di output come una stringa.

2.

generate

Restituisce il contenuto di output come iteratore.

3.

write

Scarica il contenuto di output in un oggetto file.

I parametri utilizzati da questi comandi sono i seguenti:

S.No Comando e descrizione
1.

encoding

Informa su come codificare il contenuto di output

2.

fragment

È un valore booleano che indica al prologo XML o al Doctype

3.

output

Questo tipo di serializzazione viene utilizzato per eseguire il rendering del contenuto

Esempio

Facciamo un esempio per capire come kid funziona -

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns:py = "http://purl.org/kid/ns#">
   <head>
      <title>${title}</title>
      <link rel = "stylesheet" href = "style.css" />
   </head>
	
   <body> 
      <p>${message}</p>
   </body>
</html>

The next step after saving the file is to process the template via the Kid engine.

import kid

params = {'title': 'Hello world!!', 'message': 'CherryPy.'}
t = kid.Template('helloworld.kid', **params)
print t.serialize(output='html')

Attributi del bambino

I seguenti sono gli attributi di Kid:

Linguaggio per modelli basato su XML

È un linguaggio basato su XML. Un modello Kid deve essere un documento XML ben formato con convenzioni di denominazione appropriate.

Kid implementa attributi all'interno degli elementi XML per aggiornare il motore sottostante sull'azione da seguire per raggiungere l'elemento. Per evitare la sovrapposizione con altri attributi esistenti all'interno del documento XML, Kid ha introdotto il proprio spazio dei nomi.

<p py:if = "...">...</p>

Sostituzione variabile

Kid viene fornito con uno schema di sostituzione delle variabili e un approccio semplice: $ {nome-variabile}.

Le variabili possono essere utilizzate negli attributi degli elementi o come contenuto di testo di un elemento. Kid valuterà la variabile ogni volta che avrà luogo l'esecuzione.

Se l'utente ha bisogno dell'output di una stringa letterale come $ {qualcosa}, può essere evitato usando la sostituzione della variabile raddoppiando il segno del dollaro.

Dichiarazione condizionale

Per alternare diversi casi nel modello, viene utilizzata la seguente sintassi:

<tag py:if = "expression">...</tag>

Qui, tag è il nome dell'elemento, ad esempio DIV o SPAN.

L'espressione è un'espressione Python. Se come booleano restituisce True, l'elemento verrà incluso nel contenuto di output oppure non farà parte del contenuto di output.

Meccanismo di loop

Per il ciclo di un elemento in Kid, viene utilizzata la seguente sintassi:

<tag py:for = "expression">...</tag>

Qui, tag è il nome dell'elemento. L'espressione è un'espressione Python, ad esempio per il valore in [...].

Esempio

Il codice seguente mostra come funziona il meccanismo di loop:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
   <head>
      <title>${title}</title>
      <link rel = "stylesheet" href = "style.css" />
   </head>
	
   <body>
      <table>
         <caption>A few songs</caption>
         <tr>
            <th>Artist</th>
            <th>Album</th>
            <th>Title</th>
         </tr>
			
         <tr py:for = "info in infos">
            <td>${info['artist']}</td>
            <td>${info['album']}</td>
            <td>${info['song']}</td>
         </tr>
      </table>
   </body>
</html>

import kid

params = discography.retrieve_songs()
t = kid.Template('songs.kid', **params)
print t.serialize(output='html')

Il output per il codice sopra con il meccanismo di loop è il seguente: