Artículo
· 11 hr atrás Lectura de 4 min

Uso del motor de plantillas Mako de Python para generar contenido dinámico.

Los motores de plantillas son esenciales para producir contenido dinámico personalizable, sin necesidad de compilación y ofreciendo grandes posibilidades de extensibilidad para quienes usáis las plantillas. Especialmente si el motor de plantillas es compatible con Python. Una solución popular es Mako. Es una biblioteca de plantillas escrita en Python. Ofrece una sintaxis familiar, no basada en XML, que se compila en módulos de Python para obtener el máximo rendimiento. La sintaxis y API de Mako toma ideas de otros sistemas como las plantillas de Django y Jinja2, Cheetah, Myghty y Genshi. En concepto, Mako es un lenguaje de Python embebido (es decir, tipo "Python Server Page") que refina las ideas conocidas de diseño por componentes y herencia para ofrecer uno de los modelos más claros y flexibles disponibles, manteniendo además una estrecha relación con la forma en que Python maneja llamadas y ámbitos. Mako es utilizado por reddit.com, donde sirve más de mil millones de páginas vistas al mes. Es el lenguaje de plantillas predeterminado en los frameworks web Pylons y Pyramid.
(fuente: https://www.makotemplates.org/)

Ejemplo simple con Mako

Este fragmento de código demuestra el poder de Mako para generar contenido dinámico con soporte completo de Python:

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

Sentencias de Mako:

Statement <% ... %> Ejecuta códigos Pyhton; utilizado para lógica, bucles, condicionales, etc.
Block (for loops, if) <% if condition: %> / <% for item in items: %> Comienza un bloque de control. Debe cerrarse correctamente.
End of Block <% end %> or dedent in Python Marca el final de un bloque de control (dependiendo de la sintaxis).
Include Statement <%include file="filename" /> Incluye otra plantilla o fichero.
Call Function <%call expr()%> Llama a un bloque o macro definida en la plantilla.
Macro Definition <%def name(args): %> Define una macro que puede reutilizarse.
Macro Call <%call name(args)%> Llama a una macro definida con <%def %>.

 

Uso de plantillas Mako con IRIS

He desarrollado una aplicación IRIS que utiliza Mako y el paquete health-gforms de Open Exchange (https://openexchange.intersystems.com/package/health-gforms). Para esta aplicación, se usó Mako para generar un mensaje JSON válido en formato FHIR, con el fin de crear un nuevo paciente en el servidor:

{
    "resourceType": "Patient",
    "name": [
        {
            "use": "official",
            "given": [
                "${data['name']}"
            ],
            "family": "${data['family']}"
        }
    ],
    "gender": "${data['gender']}",
    "birthDate": "${data['birthDate']}",
    "telecom": [
        {
            "value": "${data['telecom']}",
            "use": "mobile",
            "system": "phone"
        }
    ]
}

Mako recibirá un objeto de datos con los nombres de pila y apellidos del paciente, género, fecha de nacimiento y contacto telefónico. Mako obtiene estos valores para aplicarlos al contenido final usando la instrucción ${}.

Cuando se renderiza la plantilla, el resultado es:

{
    "resourceType": "Patient",
    "name": [
        {
            "use": "official",
            "given": [
                "Jack"
            ],
            "family": "Chain"
        }
    ],
    "gender": "male",
    "birthDate": "1956-01-01",
    "telecom": [
        {
            "value": "555-555-555",
            "use": "mobile",
            "system": "phone"
        }
    ]
}

El código Python embebido en IRIS para renderizar la plantilla es:

from mako.template import Template

...

for data in records:
        if getattr(data, "title") == "Given Name":
            makodata["name"] = getattr(data,"userResponse")
        elif getattr(data, "title") == "Family Name":
            makodata["family"] = getattr(data,"userResponse")
        elif getattr(data, "title") == "Gender":
            makodata["gender"] = getattr(data,"userResponse")
        elif getattr(data, "title") == "Birth Date":
            makodata["birthDate"] = getattr(data,"userResponse")
        elif getattr(data, "title") == "Phone":
            makodata["telecom"] = getattr(data,"userResponse")

template = Template(filename=templatepath)

return template.render(data=makodata)

1. Se crea una instancia de Template con el nombre del archivo de la plantilla.

2. El método template.render recibe makodata en la variable data y genera el contenido usando esos datos.

Comentarios (0)0
Inicie sesión o regístrese para continuar