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.