mod_python pour des applications web en mode ‘RAD’

Après quelques années de stand-by, mod_python revient. C’est pour nous l’occasion d’en profiter pour faire un petit tutoriel afin de voir comment lancer des petites applications web en python. Si vous souhaitez aller plus loin, je vous invite à aller sur la page du projet mod_python

Installation de mod_python

Pour commencer il suffit d’installer le package mod_python sur votre serveur via votre gestionnaire de package préféré.
A titre d’exemple sur une distribution CentOS:

yum -y install mod_python

Ensuite un fichier /etc/httpd/conf.d/python.conf est installé.
Dans notre cas, nous allons utiliser notre propre répertoire de scripts:
/var/www/html/postit/scripts/python
Pour cela créons le fichier /etc/httpd/conf.d/postit.conf avec le contenu suivant:

Alias /postit "/var/www/html/postit"

<Directory "/var/www/html/postit/scripts">
        AddDefaultCharset utf8
        AllowOverride None
        AddHandler mod_python .py
        PythonHandler mod_python.publisher
</Directory>

et redémarrons le serveur apache.

Avant de passer à la suite voici quelques petites explications. Les directives précédentes vont nous permettre de publier des pages à partir des scripts python (.py) qui seront dans le répertoire /var/www/html/postit/scripts/python
Pour appeler ces scripts, il suffira d’appeler l’url suivante:
http://monserveurapache/postit/scripts/monscript.py

Pour illustrer tout ça quoi de mieux que de commencer par passer des arguments à notre page afin de pouvoir les traiter.

Création du script

Prenons un exemple simple, nous allons additionner 2 arguments passés en paramètres dans une url:
Tout d’abord il faut importer le module util pour récupérer les arguments:

from mod_python import util

Ensuite nous allons créer d’une classe qui va faire une simple addition:

class postit:
 def __init__(self,a,b):
        self.left=a
        self.right=b
 def addme(self):
        result=int(self.left)+int(self.right)
        return result

Ici nous allons utiliser la fonction index qui est la fonction appelée par défaut. On lui passera l’objet req, il s’agit de l’objet python qui représente la structure d’une requête sous apache (pour la culture générale )

def index(req):
 form = util.FieldStorage(req)
 a = form.getfirst("gauche")
 b = form.getfirst("droite")
 x = postit(a,b)
 req.content_type = 'text/plain'
 return x.addme

Comme vous l’aurez sans doute deviné, la fonction FieldStorage du module util va nous permettre de récupérer les données de formulaire passées dans notre requête. Nos paramètres fournis seront donc « gauche » et « droite »

Ainsi il vous suffira dans votre navigateur de taper l’url suivante:
http://monserveur/postit/scripts/postit.py?gauche=3&droite=2

Je vous laisserai deviner le résultat 😉

Autre variante: on peut également utiliser d’autres fonctions en les définissant dans le script et en les appelant de la manière suivante:
http://monserveurweb/postit/scripts/postit.py/mafonction

Vous trouverez ci-dessous le code du script dans son entier:

from mod_python import util

class postit:
 def __init__(self,a,b):
        self.left=a
        self.right=b
 def addme(self):
        result=int(self.left)+int(self.right)
        return result

def index(req):
 form = util.FieldStorage(req)
 a = form.getfirst("gauche")
 b = form.getfirst("droite")
 x = postit(a,b)
 req.content_type = 'text/plain'
 return x.addme

def mafonction():
 retval='postit'
 return retval

Il existe d’autres méthodes pour utiliser python en mode « application web », cependant nous souhaitions ici montrons comment nous pouvions rapidement mettre en place ce type de pages.

Conclusion

Mais à quoi cela pourrait-il me servir ? J’utilise déjà php ! Et oui vous avez raison, cependant étant sysadmin j’utilise très rarement php pour faire des scripts. L’idée de pouvoir réutiliser mes connaissances python sur autre chose que de la ligne de commande m’a poussé à faire ce petit tutoriel. A titre d’exemple nous utilisons mod_python pour récupérer des listes JSON à partir de variables passées sur un serveur web afin que ces listes soient accessibles plus facilement depuis n’importe quelle machine.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *