1. UNIVERSIDAD MAYOR DE SAN ANDRES
Facultad de Ciencias Puras y Naturales
Postgrado en Informática
Programación Orientada a Objetos
FFRRAAMMEEWWOORRKKSS DDEE TTEEMMPPLLAATTEESS YY XXMMLL
Presentado a: Ing. M. Sc. Esteban Saavedra
Presentado por: Roger Saravia & J. J.
La Paz, Bolivia - Septiembre de 2007
2. 2
1 Introducción
El escenario de este trabajo se desarrolla en el área de los frameworks;
específicamente en los frameworks de templates y XML.
El problema identificado es el cómo elegir un framework de templates y XML dadas
ciertas necesidades.
Se abordará el problema mediante la presentación y descripción de los principales
frameworks de templates y XML.
2 Objetivo General
El objetivo general de este trabajo es comparar las principales características de los
frameworks de templates y XML más difundidos.
3. 3
3 Marco Teórico (Síntesis)
3.1 ¿Qué es un Framework de Templates y XML?
Un framework de templates y XML es principalmente un motor de plantilla (template)
inteligente con relación al lenguaje de marcado. Un framework de templates es capaz
de procesar el marcado como un flujo de eventos (streams). Además proporciona
varias herramientas para generar o trabajar con XML y HTML.
3.2 ¿Por qué un Framework de Templates?
Porque usar templates basados en texto para producir XML genera fácilmente errores y
porque considerar todos los casos podría ser no práctico. Los sistemas basados en
solo texto han fallado incluso a gente preparada que ha procurado hacer las cosas bien.
4. 4
3.3 ¿Y Cómo Funciona?
Ilustración 1. Funcionamiento de un framework de templates y XML según
Christopher Lenz (http://www.cmlenz.net).
5. 5
Casi todos los frameworks de templates usan el lenguaje Python como lenguaje base.
Por ejemplo, mediante el uso del API de Python y usando la clase Template, se tiene:
Ejemplo 1. Generación de un template mediante código de Python (D. A. R.)
6. 6
3.4 Stream de Marcado: Anatomía
El stream de marcado es básicamente una acción cíclica sobre lo que se conoce como
un evento de marcado. Por ejemplo:
Ejemplo 2. El stream y un evento de marcado (D. A. R.)
7. 7
3.5 ¿Cuándo se Produce un Stream de Marcado?
La generación de un template produce un stream.
El parsing de un HTML o XML produce un stream.
Los streams pueden ser generados programáticamente.
3.6 Procesando Streams
Un procesamiento Incluye
los siguientes pasos: iterar,
verificar la clase, ejecutar o
hacer algo y producir.
Ejemplo 3: Coloca en
mayúsculas las etiquetas
que no están a lado de un
espacio (D. A. R.)
8. 8
3.7 Filtrado de Streams
Se trata de rutinas del paquete de filtrado de streams capaces de re-usar streams; un
objeto que toma un stream y retorna otro. Ejemplo:
Ejemplo 4. Se filtra un stream removiendo cierta información y produciendo
otro stream. (D. A. R.)
9. 9
3.8 Streams: Serialización
Consiste en la producción de texto a partir de distintos eventos de streams. Hay
formatos de serialización para XML, XHTML, HTML y texto plano.
Ejemplo 5. Serialización (D. A. R.)
10. 10
3.9 Escaping (Elemento del Funcionamiento de los Frameworks de Templates)
Los templates requieren que uno explícitamente haga el “escapeo” de datos. Y tener
que “escapear” datos es bastante común.
Ejemplo 6. Una página sin “escapeo” (D. A. R.)
11. 11
3.10 Saneamiento HTML
Muchas veces hay la necesidad de
permitir al usuario ingresar código
HTML para entrar marcado. Podría
ser para la entrada de texto con
formato. El foro de participación de
la plataforma de educación virtual
Moodle es un ejemplo.
Además porque puede haber la
necesidad de protegerse ante un
usuario pirata que aproveche ésta
opción para filtrar código malicioso.
Ejemplo 7: El no saneamiento del
código HTML causó que una
compañía extranjera de poleras
imprima prendas alteradas (D. A. R.).
12. 12
3.11 Otras Funciones Avanzadas
La clonación de formularios HTML llenados con datos.
Los transformadores o filtros streams para realizar transformaciones dentro de las
etiquetas capturadas por el stream.
Ejemplo 8: Accesibilidad para gente que la necesita (D. A. R.)
Internacionalización.
13. 13
3.12 Rendimiento
El trabajo con templates basados en XML es computacionalmente más “caro” que
el trabajo con templates basados en puro texto. Esto se debe a que en el primero
se tratan con etiquetas, elementos, atributos y todo aquello; mientras que en el
caso de solo texto se tienen caracteres o bytes.
No se recomienda el uso excesivo de XML templates.
4 Casos de Estudio
4.1 Mako
Mako es una librería para templates escrita en Python. Provee una familiar sintaxis no-
XML que se compila en módulos Python para un máximo rendimiento. La sintaxis de
Mako y su API emergen de las mejores ideas de muchos otros como: Django, Cheetah,
Myghty, and Genshi. Conceptualmente, Mako es un “pitón” embebido (como es Python
Server Pages) pero con un refinamiento del diseño mediante componentes y herencia
para producir uno de los modelos más robustos y flexibles.
14. 14
Mako es usado por el sitio Pytho.org. Un vistazo a su código:
<%inherit file="base.html"/>
<%
rows = [[v for v in range(0,10)] for row in range(0,10)]
%>
<table>
% for row in rows:
${makerow(row)}
% endfor
</table>
<%def name="makerow(row)">
<tr>
% for name in row:
<td>${name}</td>
% endfor
</tr>
</%def>
Mako puede ser considerado como la siguiente generación de sistemas de templates y
hasta podría establecerse como el lenguaje por defecto de Pythons web framework.
15. 15
Características:
API simple.
Rápido.
Estructuras de control como loops sobre la base del lenguaje Python.
Se puede incluir bloques de código Python.
Puede acceder a variables fuera del template.
Puede tener anidaciones múltiples.
Puede especificar varios argumentos Python en las firmas (métodos).
Bloques del tipo llamables (callables).
Manejo avanzado de herencia.
16. 16
4.2 Kid
Es un lenguaje de templates simple para vocabularios basados en XML escrito en
Phyton. La sintaxis del lenguaje fue inspirada en lenguajes de templates existentes
como XSLT, TAL, PHP. Como hay una variedad de herramientas que trabajan con
documentos XML en Phyton, generar XML es tedioso y es común cometer errores.
APIs como SAX, DOM, o ElementTree pueden garantizar la construcción de la salida
pero requiere que esos documentos estén creados enteramente en Python.
Los lenguajes de templates como Cheetah o PTL generan texto de contenido fácil pero
ofrecen poco ayudar para asegurar que el rendimiento sea el correcto. Usar
herramientas basadas en texto para generar XML puede generar datos errados.
Características
Kid es un intento de traer los beneficios de estas tecnologías juntas en un paquete
coherente y único.
17. 17
Kid también permite al programador explotar la estructurada de XML escribiendo
filtros y transformaciones que trabajan al XML. Kid templates usa un generador
para producir ítems.
Kid puede usarse para generar cualquier tipo de documento XML incluyendo
XHTML, RSS, Átomo, FOAF, RDF, XBEL, XSLT, RelaxNG, Schematron, SOAP,
etc.
Kid soporta características mas avanzadas como condicionales (py:if), iteración
(py:for), y sub templates reusables (py:def).
Kid templates debería usar archivos con extensión .kid si esta importando el
módulo de templates usando el código normal de Phyton. El import hood de Kid
confía en el archivo de extensión .kid que esta presente.
Ventajas
Cada template de modulo exporta una clase llamada “Template”. Una instancia de
template es obtenida de una de las tres maneras siguientes:
La función Template es la mejor forma.
18. 18
Habilitando el import hood, usando el import de Pitón para obtener el modulo y
recuperando la clase Template.
Llamando a la función kid_load_template y recuperando la clase Template.
Las salidas pueden ser en formato XML o WML(wireless markup languaje).
Requerimientos:
Kid requiere plataforma Pitón 2.3 y el paquete ElementTree
Forma de instalación:
Extraer las fuentes en una carpeta y ejecutar setup.py, como lo muestra el siguiente
código.
$ gzip -dc kid-0.9.5.tar.gz | tar xvf -
$ cd kid-0.9.5
$ python setup.py install
19. 19
Si no incluye los argumentos extras en la instalación, podrá instalar los siguientes ítems:
Librerías Phyton en el directorio site-packages.
Comandos kid y kidc como script de Phyton.
Un vistazo a su código:
<?python
title = "The Mandelbrot Set"
def color(x,y):
z = c = complex(x, -y)/100.0
for n in range(16):
z = z*z + c
if abs(z) > 2:
break
return "#%x82040" % n
?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#">
<head>
<title py:content="title" />
</head>
<body bgcolor="black" text="white">
<table width="100%" height="100%">
20. 20
<tr>
<td align="center" valign="middle">
<h1 py:content="title" />
<table cellspacing="1" cellpadding="2">
<tr py:for="y in range(-150, 150, 5)">
<td py:for="x in range(-250, 100, 5)" bgcolor="${color(x,y)}" />
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
4.3 Genshi
Genshi provee un motor de template que puede usarse para generar otros marcados
(tal como HTML o XML) o texto simple. Mientras ambos comparten algo de la sintaxis (y
mucha de la implementación) ellos se separan esencialmente por el lenguaje.
21. 21
Los templates son XML o archivos de texto plano que incluyen directivas de
procesamiento que afectan al rendimiento de los templates, y templates de expresiones
que son sustituidas dinámicamente por datos variables.
Características
Sentencias condicionales como: py:if, py:choose
Iteraciones como: py:for
Reusar Snippet como: py:def, py:match
Variable Binding como: py:with
Manipulación de estructuras como: py:attrs, py:content, py:replace, py:strip
Además de includes para templates de texto e includes dinámicos.
Forma de Instalación
Extraer los fuentes en una carpeta y ejecutar $ easy_install Genshi
22. 22
Un vistazo a su código:
<?python
title = "A Genshi Template"
fruits = ["apple", "orange", "kiwi"]
?>
<html xmlns:py="http://genshi.edgewall.org/">
<head>
<title py:content="title">This is replaced.</title>
</head>
<body>
<p>These are some of my favorite fruits:</p>
<ul>
<li py:for="fruit in fruits">
I like ${fruit}s
</li>
</ul>
</body>
</html>
23. 23
Este ejemplo muestra:
a. Un bloque de código de Phyton, usando una instrucción de procesamiento.
b. La declaración del namespace de Genshi.
c. El uso de directivas de templates (py:content y py:for).
d. Expresión de Phyton (${fruit}).
El template generaría una salida parecida a:
<html>
<head>
<title>A Genshi Template</title>
</head>
<body>
<p>These are some of my favorite fruits:</p>
<ul>
<li>I like apples</li>
<li>I like oranges</li>
<li>I like kiwis</li>
</ul>
24. 24
</body>
</html>
Un template de texto es un documento de texto plano que puede contener también
código empotrado de Python. Los templates de texto pueden usarse para generar
formato de texto no marcado, tal como el cuerpo de un email de texto plano. Por
ejemplo:
Dear $name,
These are some of my favorite fruits:
#for fruit in fruits
* $fruit
#end
25. 25
4.4 Otros Lenguajes Usados
FXT Templating
Flex Templating proporciona una rica técnica de templating del lado del cliente
usando MVC (Model-View-Controller). FXT soluciona una variedad de problemas
mediante el uso de su tecnología Flex en combinación con Flash Player.
La clave está en que el modelo incluido dentro del HTML controla la vista de una
aplicación tipo Flex. En una aplicación típica basada en HTML, el modelo de datos
y las etiquetas (la vista) van mezcladas. Pero con FXT el modelo de datos y la
vista son separadas del código del template Flex hasta que arriban a la PC del
usuario.
TAL (Template Attribute Language)
Para XML templating.
Basado en atributos
TAL y Kid consisten enteramente de atributos y no de elementos.
26. 26
XSLT (XSL Transformations)
Templating
XSLT siempre ha brillado por realizar transformaciones a partir del “macheo” de los
nombres de elementos en el documento original y convertirlos en salida. O sea
hacer cambios en las mismas etiquetas.
Una desventaja del XSLT es que es bastante complejo para hacer simple
templating. Además no todo está escrito en XML; razón por la cual, XSLT está
limitado.
PXTL (Python XML Template Language)
Lenguaje completo aunque muy aparatoso.
No muy usado.
PTL (Python Template Language)
Lenguaje basado en texto que no satisface todos los requerimientos.
Comentario: Kid hace lo mismo pero con documentos XML.
27. 27
4.5 Otros Lenguajes Menos Usados
Cheetah
Característica Observación
Caché [X] Se pueden compilar los templates como clases Python.
Velocidad moderada No es muy rápido en el tema de las librerías.
Wysiwyg [ ] No. Usar un editor de texto.
Flexibilidad Grande
Diseño tipo
Python
[X] Puede usar los constructos de Python en el mismo template.
Puro python Sí
Sintaxis XML [ ] No
Curva de
aprendizaje
Corta
Comunidad Grande
Resumen
Cheetah es uno de los más sencillos y comprensivos motores de
templates. Buena documentación.
28. 28
ClearSilver
Característica Observación
Cache [ ]
Velocidad No se tienen pruebas todavía.
Wysiwyg [ ] No. Usar cualquier editor de texto.
Flexibilidad Grande
Diseño tipo
Python
Escrito en C pero incluye controladores para Python, Ruby, Perl, y
Java
Puro python No
Sintaxis XML [X]
Curva de
aprendizaje
Corta
Comunidad Pequeña
Un resumen:
ClearSilver usa un enfoque controlado por conexión a datos que
completamente separa el diseño de la aplicación lógica.
29. 29
PyMeld
Característica Observación
Caché [ ] Dejado al usuario.
Velocidad Aún no se tienen pruebas.
Wysiwyg [X] Templates consistentes en puro HTML/XHTML.
Flexibilidad Marcado
Diseño tipo
Python
[X] Bastante.
Puro python Sí
Sintaxis XML No. Basado en el atributo "id" del HTML/XHTML.
Curva de
aprendizaje
Corta
Comunidad Ninguna
Resumen:
Elegante y única herramienta para manipular HTML de manera
pitónica. Cualquier elemento (X)HTML con atributo "id" puede ser
manipulado.
30. 30
Xyaptu
Característica Observación
Caché [ ] No.
Velocidad No se ha probado aún.
Wysiwyg [ ] Solo mediante el uso de etiquetas XML.
Flexibilidad Buena Búcles, condicionales y otros.
Diseño tipo
Python
[X] Usa diccionarios, cadenas y generadores.
Puro python [X] Bastante.
Elementos del
Lenguaje
7 Sintaxis de marcado.
Curva de
aprendizaje
Muy corta
Comunidad Pequeña
Resumen Xyaptu es la sigla de: eXtended Yet Another Python Templating Unit
31. 31
ZPT
Característica Observación
Caché [ ] No se sabe.
Velocidad [ ]
WYSIWYG [ ]
El XHTML puede ser editado en WYSIWYG pero el scripting debe ir
entre espacios de nombre XML.
Diseño tipo
Python
[ ]
Flexibilidad
Integration
Puro Python [X]
Sintaxis XML [X]
Curva de
aprendizaje
Media Depende del conocimiento sobre Python y XML.
Comunidad Media Llamada ZOPE con soporte disponible.
32. 32
Resumen
Es aconsejable para el fácil diseño web que permite la no
“perturbación” del scripting embebido en la página. ZPT puede ser
usado solo con documentos XML y no con otros documentos
basados en texto o CSS.
py.xml
Característica Observación
Caché [ ] Ninguna
Velocidad [ ]
WYSIWYG [ ] No. Usar cualquier editor de texto.
Diseño tipo
Python
[X] py.xml está basado en Python para generar XML.
Puro Python [X]
Sintaxis XML [ ] No. Todo el código está basado en Python.
Curva de
aprendizaje
No Si uno sabe Python, puede py.xml.
33. 33
Comunidad ¿?
Resumen
La librería del py ofrece una manera pitónica de generar XML/HTML
basada en ideas que usan clases de objetos de Python para generar
los árboles XML.
4.6 Comparación de Tiempos de los “Principales” Frameworks de Templates
Sobre un diseño sencillo que incluya 3 frames (marcos):
Framework de Templates Tiempo de Respuesta
Mako 1.10 ms
Myghty 4.52 ms
Cheetah 1.10 ms
Genshi 11.46 ms
Django 2.74 ms
Kid 14.54 ms
34. 34
5 Conclusiones
El elemento clave del funcionamiento de los frameworks de templates es el stream de
marcado que captura eventos de marcado. Su buen conocimiento puede ser clave
también para la buena programación en los lenguajes de templates.
Hay una gama grande de frameworks para templates. La mayoría de ellos están
basados en el lenguaje Python y XML; no obstante hay algunos que se basan en puro
Python. Pueden apreciarse en muchos de ellos es el uso de clases, objetos y herencia.
Debido a su rendimiento, Mako podría ser el framework de templates estándar de la
próxima generación.
Kid es una de las mejores opciones puesto que compila lo mejor de varias tecnologías y
ofrece una respuesta multiformato basada casi enteramente en XML.
Genshi es una tecnología robusta y basada en Kid pero permite además el “plantillado”
(templating) de texto plano.
XSLT tiene la gran ventaja de estar siempre presente puesto que se incluye junto a la
tecnología XML; no obstante es de implementar y no incluye Python.
35. 35
Los lenguajes más recientes son como unidades sueltas de framework templating
orientados a trabajos con formatos específicos.
Hay poco benchmarking e información sobre pruebas con relación a las características
de todos los frameworks de templating. Mako está entre uno de los más rápidos
lenguajes de templates.
Los lenguajes de templating trabajan con etiquetas y todo aquello; razón por la cual
consumen "cómputo" y deben usarse con discreción.
6 Referencias
RYAN TOMAYKO “In search of a Pythonic, XML-based Templating
Language”. [En red]. Disponible en:
http://www.tomayko.com
CHERRY PY “Choosing a templating language”. [En red]. Disponible
en: http://www.cherrypy.org