Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 1 livre papier acheté 
= la version en ligne automatiquement offerte. Cliquez ici
  1. Livres et vidéos
  2. Scripting Python sous Linux
  3. La génération de rapports
Extrait - Scripting Python sous Linux Développez vos outils système (2e édition)
Extraits du livre
Scripting Python sous Linux Développez vos outils système (2e édition)
3 avis
Revenir à la page d'achat du livre

La génération de rapports

Introduction

Par génération de rapport, il faut comprendre génération automatique de documents. Il n’est pas rare de devoir envoyer un mail quand un fichier arrive, générer un état des disques ou des tables dans la base de données.

Bref, il faut communiquer de l’information et dans ce cas, on utilise généralement un format dédié : le format PDF.

Mais parfois, il faut aussi présenter les choses de manière simple et compréhensible pour tout le monde, et là, rien ne remplace le format HTML.

Ce chapitre est dédié à la génération automatique de document, mais aussi à la manière de générer des sites statiques à vocation interne.

La génération de PDF : Reportlab

La génération de rapports sur l’état des serveurs, la liste des machines virtuelles, le volume des bases de données… tout cela peut devenir fastidieux, même s’il s’agit de faire un copier/coller dans un document bureautique, document bureautique que l’on va envoyer au format PDF, qui est un format non modifiable (ou presque).

PDF (ou Portable Document Format) est un format créé par la société Adobe dans les années 1990, et qui est devenu depuis une norme ISO.

Le format PDF permet de présenter du texte, des images et d’autres médias, et ce quel que soit le système d’exploitation. Il est couramment utilisé dans le monde professionnel pour diffuser de l’information que l’on souhaite non modifiable. 

Pourquoi ne pas générer directement le fichier PDF ?

On s’aperçoit très vite que les recherches Python sur la génération de PDF mènent quasiment toutes vers ce site : https://www.reportlab.com/

ReportLab est une entreprise commerciale, mais propose deux versions de son moteur de génération de PDF, dont l’une est open source et fait partie de quasiment toutes les distributions Linux.

Et pour finir, c’est écrit en Python.

L’outil est suffisamment imposant pour que des livres en fassent leur sujet (la documentation fournie sur le site fait quand même plus de 130 pages) : https://www.reportlab.com/docs/reportlab-userguide.pdf

Mais voici quelques scripts et conseils pour bien commencer.

Prérequis : pip install reportlab

Et le début en informatique est "hello world".

1. Hello World en PDF et Reportlab

#fichier : report/hello_reportlab.py 
 
from reportlab.pdfgen import canvas 
c = canvas.Canvas("hello.pdf") 
c.drawString(100,100,"Bonjour le monde en pdf avec reportlab") 
c.save() 

Voici comment exécuter le script :

$ python hello_reportlab.py && evince hello.pdf 

Normalement, un fichier hello.pdf a été généré et s’affiche, dans notre cas, grâce à la commande evince, mais il y a beaucoup d’autres visionneurs PDF.

On peut constater que le point d’origine de la page se trouve en bas à...

Le moteur de patrons Jinja2

Jinja est ce que l’on appelle un moteur de templates (patrons en français…).

Le framework Django l’utilise, mais dans une version modifiée, essentiellement pour le rendre plus sécure.

L’intérêt de Jinja est qu’il est écrit en Python et très fortement intégré à ce langage. 

L’installation se fait avec ’pip install jinja2’.

Les moteurs de templates fonctionnent quasiment tous de la même manière : à partir d’un patron (template), on effectue le rendu en transmettant un contexte.

Un patron est constitué de parties fixes et de parties variables ; Jinja fournit même des boucles et des tests. Il est ainsi possible de générer différentes sorties avec un même patron en fonction du contexte.

Voici un exemple très simple :

#fichier : jinja/j1.py 
 
from jinja2 import Template 
 
reponse = input("Votre nom : ") 
 
tm = Template("Bonjour {{ nom }}") 
texte = tm.render(nom=reponse) 
 
print(texte) 

Le résultat est sans surprise :

$ python j1.py 
Votre nom : chris 
Bonjour chris 

Mais c’est juste pour comprendre le principe.

1. Jinja et le HTML

En fait, Jinja a été créé pour la génération de pages HTML. Dans un site web, beaucoup de choses reviennent de page en page comme l’en-tête, le pied et certains paramétrages.

Jinja permet de préparer l’équivalent d’un fond de page et de générer une page avec ce fond. Par contre, cela impose une certaine structure dans les fichiers, car Jinja doit pouvoir retrouver les fichiers appelés par d’autres.

C’est pour cette raison qu’il est nécessaire de créer un répertoire (ex : tmpl) pour stocker les patrons. Ces derniers seront des fichiers avec le suffixe .jinja, mais c’est juste pour bien les différencier, il n’y a pas d’obligation de ce côté.

Maintenant, voici comment fonctionne le principe de base de Jinja :

Un patron pour servir de base à toutes les pages ; il doit définir la structure de chaque page par la définition de bloc. Son nom : base.jinja.

Un patron...

Un autre moteur de patron : Pug/Jade

Jinja est un des moteurs de templates fortement liés à Python. Et pourtant, il y a du côté de node.js et du langage JavaScript un moteur de template très appréciable et qui devrait plaire à beaucoup de pythonistes.

Le nommer est un peu compliqué, car son nom de départ est ’Jade’, mais comme il s’agit d’un nom déposé, il a dû être renommé en ’Pug’. Bientôt, tout ceci devrait se simplifier. Mais sur le net, on trouve encore parfois de la doc avec un nom et parfois avec l’autre nom.

Pourquoi parle-t-on de ce moteur de template ?

Il a adopté l’indentation comme syntaxe pour écrire du HTML, ce qui nous réconcilie avec le HTML.

Un petit exemple pour comprendre :

// ================== 
//- Hello . jade 
// ================== 
doctype html(lang="fr") 
html 
   head 
       include /include/head.jade 
       title HELLO : PUG/JADE 
   body 
       .container 
           h3(class="text-muted") HELLO PUG/JADE : A Propos 
           include /include/nav.jade 
           .jumbotron 
               h1(class="display-3") A propos de ce site 
               p(class="lead text-justify") 
                   | Quelques explications sur ce site : <br/> 
                   | <br/> 
                   | Utilisation de <br/> 
                   | - Jade / pug <br/> 
                   | - Bootstrap  <br/> 
 
        include /include/footer.jade 
        include /include/scripts.jade 

Et tout de suite, le HTML devient lisible et, en plus, le résultat est joli avec l’aide de Bootstrap. De plus, cela fonctionne sur beaucoup de types...

Résumé

Encore un exemple où Python se révèle être un outil précieux.

Reportlab est une librairie pour générer du PDF.

Jinja est un moteur de templates écrit en Python, bien pratique.

Pug/Jade n’est pas du Python, mais vu que cela utilise l’indentation comme syntaxe...

Make reste encore un outil incontournable malgré son ancienneté.