36
UNIVERSIDAD MAYOR DE SAN ANDRES Facultad de Ciencias Puras y Naturales Postgrado en Informática Programación Orientada a Objetos F F R R A A M M E E W W O O R R K K S S D D E E T T E E M M P P L L A A T T E E S S Y Y X X M M L L Presentado a: Ing. M. Sc. Esteban Saavedra Presentado por: Roger Saravia & J. J. La Paz, Bolivia - Septiembre de 2007

Frameworks de Templates y XML

Embed Size (px)

DESCRIPTION

frameworks,de,templates,y,xml

Citation preview

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

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 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<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

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

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

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

</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

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

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

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

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

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

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

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

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

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

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

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

36

CHRISTOPHER LENZ “Genshi”. [En red]. Disponible en: http://www.cmlenz.net

GENSHI “Genshi Templating Basics”. [En red]. Disponible en: http://genshi.edgewall.org

KID “Pythonic, XML-based Templating”. [En red]. Disponible en: http://www.kid-templating.org

MAKO “Mako Templates for Python”. [En red]. Disponible en: http://www.makotemplates.org

ONFLEX “FXT - Flex Templating”. [En red]. Disponible en: http://www.onflex.org