Réaliser un IHM web avec Python et Bottle

Publié le 10 juin 2010 par Luc

Il existe de nombreux frameworks de développement web en Python. Le plus connu, et à mon avis le plus efficace, reste Django mais je voudrais vous présenter Bottle, une solution très légère dont la philosophie est complètement différente de celle de Django. Idéal pour développer très rapidement par exemple une IHM web.

La légèreté comme philosophie

Django se veut le framework des perfectionnistes sous pression. Il est pensé comme une solution complète apportant l'ensemble des outils nécessaires pour développer rapidement un site internet. Il gère en particulier la base de données, les utilisateurs, le site d'administration et bien plus encore.

Bottle a une approche beaucoup plus minimaliste d'un framework web. Il se contente de fournir la mécanique nécessaire à la génération d'une page à partir d'une URL. L'accès à la base de données, l'authentification des utilisateurs sont laissés à la responsabilité du développeur. L'avantage est de minimiser les dépendances et de proposer une librairie beaucoup plus légère ce qui peut se révéler primordial si on souhaite déployer une application web packagée sans nécessiter que Python soit installé sur la machine.

Une page web = Une fonction Python

Du point de vue du code, là aussi Bottle recherche la légèreté. Une page web peut s'écrire en quelques lignes seulement:

import bottle
@bottle.route("/")
def index():
    return "Hello world!"
bottle.run() #lance le serveur web en localhost sur le port 8080

Ouvrez un navigateur sur la page http://localhost:8080 et la page affiche "Hello world!". On voit ici qu'écrire une page web, assez minimaliste il est vrai, revient à écrire une fonction Python. On se soucie dans cet exemple assez peu de la mécanique HTTP et du serveur web.

Les décorateurs pour simplifier le développement

Il n'y a pas de magie là dessous mais une utilisation très judicieuse des décorateurs Python. Peut-être vous demandez ce qu'est un décorateur si vous n'avez pas encore abordé cette notion du langage Python. C'est tout simplement une fonction qui prend en argument une fonction et retourne une fonction.

Voici un exemple simple de décorateur qui permet de tracer les appels de fonction:

def trace(fn): #le code decorateur
print "appel", fn.__name__
return fn
@trace
def toto():
return 1
@trace
def titi():
return 2
print toto()+titi()
>>> toto
>>> titi
>>> 3

En décorant une fonction, on modifie, parfois totalement, son comportement. Lorsqu'on fait référence au nom de la fonction dans le code on ne fait plus référence à cette fonction mais à son décorateur.

Par exemple:

def titi(): return 0
def decore(fn): return titi
@decore
def toto():
   return 2
print toto.__name__
>>> titi

Bottle utilise ce mécanisme pour associer une URL avec la fonction à exécuter lorsque celle-ci est appelée. Le décorateur 'route' va ajouter automatiquement la mécanique nécessaire au mapping URL-fonction et permettra au développeur de se concentrer sur la logique applicative.

Les outils nécessaires pour générer une page web

Bottle ne se limite pas à ce décorateur et au serveur web intégré mais propose d'autres services.

Il inclut en particulier un langage de template pour la génération de page HTML.

Créez le fichier hello.tpl avec le contenu suivant dans le répertoire du script Python

<html>
<body>
Hello {{name}}!
</body>
</html>

et modifiez le script d'exemple pour avoir

import bottle
@bottle.route("/")
def index():
    return bottle.template('hello', name='World')
bottle.run() #lance le serveur web en localhost sur le port 8080

le code HTML est isolé dans un template ce qui facilite à la fois la l'écriture des pages ainsi que la lisbilité du code. Le langage de template est très puissant puisqu'il permet d'intégrer du Python en particulier des boucles for. Seul bémol, l'héritage des templates n'est pas aujourd'hui pris en compte. Peut-être une amélioration pour les versions futures.

Bottle gère aussi

  • La gestion des codes HTTP permettant de remonter une erreur ou de rediriger une page.

  • L'envoi de fichier via la fonction send_file.

  • La gestion des requêtes POST, des cookies et des entêtes HTTP aussi facilement que d'accéder à un dictionnaire Python.

  • La conversion automatique au format JSON lorsque la fonction retourne un dictionnaire.

Un exemple d'utilisation avec l'IHM de Modbus Test Kit

A mon avis, Bottle est une solution idéale pour les besoins d'IHM assez simple. Je l'ai donc utilisé pour réaliser l'IHM web de Modbus Test Kit disponible depuis la version 0.4 qui vient de sortir. La facilité de développement, les faibles dépendances, ce qui est aussi un but de modbus-tk, ainsi que la possibilté de packager le code Python dans un exécutable autonome avec par exemple py2exe sont les principales raisons de ce choix. Il aurait été plus difficile d'arriver au même objectif avec Django.

Je vous invite à consulter le site de Bottle pour découvrir plus en détail cet outil très agréable à utiliser.

Django se veut le framework des perfectionnistes sous pression. Il est pensé comme une solution complète apportant l'ensemble des outils nécessaires pour développer rapidement un site internet. Il gère en particulier la base de données, les utilisateurs ...