He descubierto a Cheetah, un sistema de plantillas para Python muy pontente que puede facilitar la comprensión de las plantillas a los diseñadores y a la vez hacer más fácil la programación.
¿Qué es Cheetah y como funciona?
Cheetah es un sistema de plantillas que te permite de forma fácil preparar una plantilla y compilarla con tus datos sin que tengas que mezclar nada de código HTML y Python, claro que si lo deseas lo puedes hacer.
Cheetah es una librería que te permite generar código html fusionando los datos de un diccionario con una plantilla, usando si es necesario bucles y condicionales en el propio HTML
sin python.
Ahora voy a ponerte un ejemplo en cuatro etapas, la primera será para ver su funcionamiento más básico en un hola mundo, después usaremos variables, y por último, compilaremos nuestras plantillas.
Primero instala Cheetah, al final de este documento encontrarás más información así como la página oficinal, aunque seguro que tu distribución ya lo incluye y será suficiente con instalarlo desde el gesto de paquetes de la distribución, en gentoo sería "emerge cheetah" y en ubuntu "apt-get install cheetah".
Familiarizándonos con Cheetah
Abre una consola y ejecuta python, ahora, copia este código, seguro que lo entederás a la primera!!
>>> from Cheetah.Template import Template
>>> print Template('hola mundo!')hola mundo!
Como observarás de momento parece un sencillo
print "hola mundo", y es que no hemos usado aún variables. La clase Cheetah admite como parámetro un texto que será la plantilla y la lista de palabras a sustituir en la plantilla. Veámoslo:
>>> texto = "Hola $nombre, ¿que tal estás?"
>>> usuario = {'nombre': 'coco'}>>> print Template(texto, [usuario])
Hola coco, ¿que tal estás?
Fíjate que el texto a sustituir son los valores del diccionario que le hemos pasado como segundo parámetro, las variables en Cheetah siempre comienzan con un dolar, además, es muy fácil usar objetos o estructuras más completas:
>>> class usuario:
>>> nombre = 'Perico'
>>> apellidos = 'Palotes'
>>> edad = 25
>>> perico = usuario()
>>> texto = "Hola $nombre $apellidos, me alegra saber que tienes $edad años!"
>>> print Template( texto, [usuario] )
Hola Perico Palotes, me alegra saber que tienes 25 años!
Más difícil todavía, ¡código HTML y plantillas!
Hemos visto como Cheetah genera texto, pero seamos sinceros, casi es más fácil hacer eso mismo usando python tal cual, por ejemplo,
" s(usuario)% " % usuario en vez de una pantilla, ¿por qué iba a usar Cheetah para algo tan fácil?, pues es verdad, veamos algo más útil.
Abre tu editor de texto favorito e introduce el siguiente código:
<html>
<head>
<style>
td { width: 10px; height: 5px;}</style>
</head>
<body>
<h1>Tabla de colores WebSafe</h1>
<table cellspacing='0'>
#for $row in $colores
<tr>
#for $color in $row
<td style='background-color: $color'></td>
#end for
</tr>
#end for
</table>
</body>
</html>
Guárdalo con el nombre de
"websafecolors.tmpl" y vamos a escribir el código Python para esa plantilla.
from Cheetah.Template import Template
colores = []
tmp = []
for x in range(0,256, 51):
for y in range(0,256, 51):
for z in range(0,256, 51):
tmp.append("rgb(%d, %d, %d)" % (x, y, z)) colores.append(tmp)
tmp = []
html = str(Template(file='websafecolors.tmpl', searchList=[{'colores': colores}]))open('websafe.html', 'w').write(html)
Guardarlo con el nombre de websafe.py, como estarás viendo, la plantilla contiene dos bucles tipo for, su uso es idéntico al de Python, for <variable> in <matriz> con la excepción de que debe comenzar con una almohadilla, todas las estruturas en Cheetah comienzan así.
Si ejecutas el script generará un archivo llamado websafe.html que contiene la tabla de colores que se consideran seguros (una reliquia de las pantallas CGA de 255 colores!).
Cheetah compila la plantilla y la convierte en código Python antes de procesar las variables, así que el bucle y sus variables
son variables de python con todas sus ventajas, por ejemplo, podríamos hacer algo como ésto:
<h1>$nombre.capitalize()</h1>
Ya que
$nombre se traducirá a algo así como parameters[
'nombre'] y por lo tanto parameters['nombre'].capitalize() es válido.
(1ª)¡Bucles, condicionales y variables!
Teniendo en cuenta que el código de la plantilla será convertido en código Python se hace realmente fácil comprender como funcionará un condicional e incluso como definir o modificar variables desde Cheetah.
Siempre comenzaremos por la almohadilla
#set $usu = ($usuario.nombre + " " + $usuario.apellidos).capitalize()
#if $usuario.nombre == 'Perico'
Hombre Perico, ¡cómo tú por aquí!
#else
Hola $usu, encantado de conocerte!!
#end if
Optimizando Cheetah
Cheetah genera un módulo en Python que luego será convertido en texto. Todo esto lleva su tiempo de proceso y en servidores WEB puede ser determinante, si es nuestro caso, o si decidimos utilizar Cheetah en algún otro entorno donde no queramos incluir los ficheros de plantillas podemos compilarlo. Compilar en Cheetah significa traducir la plantilla a código Python utilizable como un módulo más, veamos un ejemplo sencillo:
Desde la consola y en el directorio donde se encuentra nuestra plantilla ejecutamos:
$ cheetah compile websafecolors.tmpl
Compiling websafecolors.tmpl > websafecolors.py
Ahora tenemos un módulo llamado websafecolors, que podremos importar desde nuestro script websafe.py, que quedaría así:
from websafecolors import websafecolors
colores = []
tmp = []
for x in range(0,256, 51):
for y in range(0,256, 51):
for z in range(0,256, 51):
tmp.append("rgb(%d, %d, %d)" % (x, y, z)) colores.append(tmp)
tmp = []
wsc = websafecolors()
wsc.colores = colores
open('websafe.html', 'w').write(str(wsc))Notas
1ª. Los nombres que he puesto son a título ilustrativo, en realidad no tiene esa forma en absoluto.
Referencias