¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Scripting Python en Linux
  3. La generación de informes
Extrait - Scripting Python en Linux Desarrolle sus herramientas de sistema
Extractos del libro
Scripting Python en Linux Desarrolle sus herramientas de sistema Volver a la página de compra del libro

La generación de informes

Introducción

Por generación de informes, debemos comprender la generación automática de documentos. No es raro tener que enviar un correo electrónico cuando llega un archivo, generar un informe de los discos o tablas en la base de datos.

En definitiva, hay que comunicar información y en este caso se suele utilizar un formato dedicado: el formato PDF.

Pero a veces, también hay que presentar las cosas de una manera simple y comprensible para todos y ahí, no hay nada que reemplace al formato HTML.

Este capítulo está dedicado a la generación automática de documentos, pero también a la manera de generar sitios estáticos para fines internos.

La generación de PDF: Reportlab

La generación de informes sobre el estado de los servidores, el listado de máquinas virtuales, el volumen de las bases de datos, etc. todo esto se puede volver tedioso, incluso si se trata de hacer un copiar/pegar en un documento de oficina, documento de oficina que enviaremos en formato PDF, que es un formato no modificable (o casi).

PDF (o Portable Document Format), es un formato creado por la empresa Adobe en la década de 1990 y que desde entonces se ha convertido en un estándar ISO.

El formato PDF le permite presentar texto, imágenes y otros medios, independientemente del sistema operativo. Se utiliza habitualmente en el mundo profesional para difundir información que desea que no se modifique.

¿Por qué no generar el archivo PDF directamente?

Rápidamente nos damos cuenta de que casi todas las búsquedas Python sobre la generación de PDF, conducen a este sitio: https://www.reportlab.com/

ReportLab es una empresa comercial, pero ofrece dos versiones de su motor de generación de PDF una de las cuales es de código abierto y forma parte de casi todas las distribuciones de Linux.

Y finalmente, está escrito en Python.

La herramienta es lo suficientemente grande para que sean necesarios libros para abordar el tema (la documentación proporcionada en el sitio incluso aún tiene más de 130 páginas): https://www.reportlab.com/dev/docs/

Pero aquí hay algunos scripts y consejos para comenzar.

Requisitos previos: pip install reportlab

Y el inicio en informática es "hola mundo".

1. Hola mundo en PDF y Reportlab

#archivo: report/hello_reportlab.py  
  
from reportlab.pdfgen import canvas  
c = canvas.Canvas("hola.pdf")  
c.drawString(100,100,"Hola mundo en pdf con reportlab")  
c.save() 

A continuación se muestra cómo ejecutar el script:

$ python hello_reportlab.py && evince hola.pdf 

Normalmente se genera y muestra un archivo hola.pdf, en nuestro caso, usando el comando evince, pero hay muchos otros visores de PDF.

Podemos comprobar que el punto de origen de la página está en la parte inferior izquierda, pero no se preocupe, es una opción.

Un recorrido rápido por las propiedades de dicho PDF, muestra que es un formato A4, por lo que es mucho mejor.

Entre las técnicas...

El motor de plantillas Jinja2

Jinja es lo que llamamos un motor de templates (plantillas en español).

El framework Django lo usa, pero en una versión modificada, principalmente para hacerlo más seguro.

El interés de Jinja es que está escrito en Python y está fuertemente integrado en este lenguaje.

La instalación se realiza con ’pip install jinja2’.

Los motores de plantillas funcionan casi todos de la misma manera: a partir de una plantilla (template), renderizamos transmitiendo un contexto.

Un patrón se compone de partes fijas y partes variables; Jinja incluso proporciona bucles y pruebas. Por tanto, es posible generar diferentes salidas con el mismo patrón dependiendo del contexto.

A continuación se muestra un ejemplo muy sencillo:

#archivo: jinja/j1.py  
  
from jinja2 import Template  
  
respuesta = input("Su nombre: ")  
  
tm = Template("Hola {{ nombre }}")  
texto = tm.render(nombre=respuesta)  
  
print(texto) 

El resultado no tiene sorpresas:

$ python j1.py  
Su nombre: Ángel  
Hola Ángel 

Pero es suficiente para entender el principio.

1. Jinja y el HTML

De hecho, Jinja fue creado para la generación de páginas HTML. En un sitio web, hay muchas cosas que se repiten de una página a otra, como el encabezado, el pie de página y ciertas configuraciones.

Jinja permite preparar el equivalente a un fondo de página y generar una página con este fondo. Por otro lado, esto impone una cierta estructura en los archivos, porque Jinja debe poder encontrar los archivos llamados por otros.

Por esta razón es necesario crear un directorio (por ejemplo: tmpl), para almacenar los patrones. Estos serán archivos con el sufijo .jinja, pero es solo para diferenciarlos, no hay obligación en este sentido.

Ahora se muestra cómo funciona el principio básico de Jinja:

Un patrón que sirva de base a todas las páginas; debe definir la estructura de cada página por la definición de bloque. Su nombre: base.jinja.

Un patrón por página; debe comenzar heredando del patrón base gracias a la etiqueta ’extend’.

Todo lo que falta es un script para comenzar a renderizar la página.

Para entrar un poco más...

Otro motor de plantillas: Pug/Jade

Jinja es uno de los motores de plantillas fuertemente relacionados con Python. Y, sin embargo, por parte de node.js y del lenguaje JavaScript, hay un motor de plantillas muy apreciable que debería atraer a muchos pythonistas.

Nombrarlo es un poco complicado, ya que su nombre original es ’Jade’, pero como es un nombre registrado, tuvo que ser renombrado como ’Pug’. Pronto todo esto debería ser más fácil. Pero en la red, algunas veces todavía encontramos documentos con un nombre y otras veces, con el otro.

¿Por qué estamos hablando de este motor de plantillas?

Adoptó la indentación como sintaxis para escribir HTML, lo que nos reconcilia con HTML.

Un pequeño ejemplo para entenderlo:

// ==================  
//- Hola . jade  
// ==================  
doctype html(lang=“es”)  
html  
   head  
       include /include/head.jade  
       title HOLA: PUG/JADE  
   body  
       .container  
           h3(class="text-muted") HOLA PUG/JADE: Acerca de  
           include /include/nav.jade  
           .jumbotron  
               h1(class="display-3") Acerca de este sitio  
               p(class="lead text-justify")  
                   | Algunas explicaciones sobre este sitio: <br/> 
                   | <br/>  
                   | Uso de <br/>  
                   | - Jade / pug <br/>  
                   | - Bootstrap  <br/>  
  
        include /include/footer.jade  
        include /include/scripts.jade 

Y de inmediato, el HTML se vuelve legible y además, el resultado es bonito con la ayuda de Bootstrap. Además...

Resumen

Otro ejemplo en el que Python está demostrando ser una herramienta valiosa.

Reportlab es una librería para generar PDF.

Jinja es un motor de plantillas escrito en Python, muy práctico.

Pug/Jade no es Python, pero como usa la indentación como sintaxis...

Make sigue siendo una herramienta imprescindible, a pesar de su antigüedad.