Python et Apache avec mod_python : tutoriel

Juin 2013

Voici un bon tutoriel qui va vous expliquer comme installer Apache, Python et mod_python pour vos développements web et débuter la programmation de vos premières pages.

Pour les besoins de cet article je présume que vous utilisez une distribution Linux (GNU) dans le style de Ubuntu ou debian. Dans mon cas, particulier certes, c'est sur une distribution Ubuntu Server 64 bits que j'ai fais ces manipulations.

De même, j'imagine que vous avez quelques notions en programmation Python bien que si vous connaissez un autre langage ce tutoriel ne doit pas vous poser plus de problèmes que cela.

Autre chose : il est tout à fait possible d'utiliser Apache avec un autre langage de script comme PHP. Ce tutotriel concerne avant tout ceux qui souhaite se familiariser avec Python pour le web. De même, il existe d'autres solution que mod_python pour arriver à cela : web.py, cherryPy, etc.

Seul mod_python sera donc évoqué.

L'installation

Tout d'abord nous allons mettre à jour les données de paquets de votre distribution à l'aide des commandes suivantes :

sudo apt-get update

sudo apt-get upgrade

Vous serez alors certains d'avoir l'ensemble des paquets à jour.

Maintenant que c'est fait il va nous falloir installer les logiciels qui'il nous faut : Apache pour la partie serveur, Python comme langage de script et mod_python qui va servir à faire le lien entre vos scripts Python et le serveur.

sudo apt-get install apache2 python libapache2-mod-python

Logiquement vous devriez avoir un serveur web Apache qui fonctionne (un petit top permet de vérifier cela) et la commande "python" répond correctement avec le prompt Python qui s'affiche et attend vos instructions.

Vous pouvez aussi vérifier que la page par défaut de Apache s'affiche lorsque vous ouvrez un navigateur internet et que vous entez localhost ou 127.0.0.1 dans la barre d'adresse.

Si tout est bon, nous devons maintenant configurer mod_python pour qu'il fonctionne avec Apache.

Configuration de Apache avec mod_python

C'est la partie un peu subtile pour les débutants car mod_python propose plusieurs types de configurations qui sont parfaitement fonctionnelles mais qui vont influer sur votre façon de programmer.

Tout d'abord, nous allons configurer l'environnement Virutalhost par défaut d'Apache. Vu comme nous sommes dans un tutoriel sur mod_python, je ne rentrerai pas dans les détails à ce niveau et nous allons conserver les paramètres par défaut en modifiant seulement ce dont nous avons besoin.

La configuration d'Apache se trouve dans le répertoire /etc/apache2

La configuration du site par défaut se trouve dans le fichier /etc/apache2/sites-enabled/000-default que nous allons édité avec votre éditeur de texte favori (vim dans mon cas) :

sudo vim /etc/apache2/sites-enabled/000-default

Dans le fichier il faut trouver les lignes qui concernent le répertoire par défaut /var/www dans lequel les fichiers du site web sont déposés et insérer les lignes en gras :

<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On
</Directory>

Ces trois lignes auront pour but :

  • d'activer mod_python pour les scripts
  • d'activer l'option Publisher pour mod_python
  • d'activer le debugage (information d'informations sur l'execution du script en cas de problème)

Pour ce tutorial j'ai choisi de parler du mode Publisher qui permet de créer des programmes complet en Python qui seront lu par Apache (je schématise).

Mod_python propose aussi un autre mode de fonctionnement qui est le mode PSP qui permet, via les tags <% %> de mélanger du code Python avec du code HTML (un peu comme PHP) dans le même fichier .psp. Le Python est alors interpréter au milieu du code HTML.

Nous ne parlerons que du mode Publisher dans ce tutoriel.

Il nous faut maintenant redémarrer Apache pour que la nouvelle configuration soit bien prise en compte :

/etc/init.d/apache2 restart

Ceci dit, normalement tout doit fonctionner et vous pouvez commencer à programmer vos pages Web en Python ! Bravo. Il faut maintenant créer sa première page Web Python.

Ma première page Web en Python avec mod_python

Vous allez pouvoir créer un fichier nommé fichier.py dans le répertoire /var/www. Voici le contenu du fichier :

def index(req):
message = """
<html>
<head><title>Test</title></head>
<body>
<p>Coucou tout le monde</p></body></html>
"""
return message

N'oubliez pas de bien respecter l'indentation, on programme du Python ! Maintenant que c'est fait vous pouvez accéder au fichier via l'adresse http://localhost/fichier.py vous devriez alors voir le message "coucou tout le monde" apparaître.

Vous avez surement remarqué que nous avons créé une fonction pour l'index. Il est donc possible de créer une autre fonction pour afficher une autre page.

Complétez le fichier en rajoutant cette fonction à la suite de la fonction index(req) :

def plus(req):
message = """
<html><body><p>Nouvelle requete plus !</p></body></html>
"""
return message

Sauvegardez le fichier et rendez-vous sur l'url http://localhost/fichier.py/plus vous devriez alors voir le nouveau message !

Jusqu'à présent, nous avons utilisé l'extension .py dans les URL, mais vous pouvez aussi accéder au même contenus via ces deux URL :

  • http://localhost/fichier/
  • http://localhost/fichier/plus

Voilà, vous êtes maintenant capables de créer des pages Internet à l'aide du langage Python. Mais, vous vous demandez peut-être comment réaliser des pages avec formulaires ?

Pas de problème, on voit cela tout de suite.

Pages web avec formulaire pour mod_python

Nous allons voir comment réaliser un upload de fichier en Python grâce à mod_python pour Apache. L'idée est d'uploader une image dans un répertoire du serveur.

Pour réaliser cela, nous allons ajouter une nouvelle fonction à notre fichier fichier.py :

def upload():
html = '''
<html>
<body>
<form enctype="multipart/form-data" id="fileUpload" action="./resultat" method="post">
<input type="file" name="file"/>
<input type="submit" value="Upload"/>
</form>
</body>
</html>
'''
return html

Comme vous pouvez le constater cette fonction afficher un formulaire, vous pouvez voir en vous rendant sur l'URL http://localhost/fichier/upload

Logiquement vous devriez voir le formulaire. Il faut maintenant créer la fonction "resultat" qui est appelée lors de l'envoi du formulaire.

Pour ce faire, rien de plus simple, ajoutez cette fonction à la fin de votre fichier :

def resultat(req):
fileitem = req.form['file']
if fileitem.filename:
fname = os.path.basename(fileitem.filename)
dir_path = os.path.join(os.path.dirname(req.filename), 'files')
open(os.path.join(dir_path, fname), 'wb').write(fileitem.file.read())
message = 'Le fichier "%s" est bon' % fname
else:
message = 'KO'
return message

Cette fois c'est un peu plus compliqué, je vais tenter d'expliquer les choses simplement,y compris pour celles et ceux qui ne sont pas familiers de Python.

Tout d'abord, si vous exécutez le script depuis l'adresse et que vous uploadez un fichier, vous vous rendez compte qu'il manque quelque chose pour que cela fonctionne bien.

En effet, nous utilisons des fonctions liées au système d'exploitation pour la gestion des fichiers. Il est donc nécessaire d'ajouter cette instruction pour indiquer au script Python qu'il doit charger les bonnes librairies :

import os

Maintenant que c'est fait, assurez-vous aussi qu'il existe bien le répertoire "files" au même endroit que le fichier fichier.py et qu'il est possible d'écrire dedans (pour y stocker le fichier).

Si tout cela est bien fait, tout devrait bien fonctionner maintenant. On peut passer au passage en revue du script.

Tout d'abord, on récupère le contenu du champ du formulaire "file" depuis cette instruction :

fileitem = req.form['file']

Ici, req contient l'ensemble de la requête et req.form le contenu des champs du formulaire. On vérifie ensuite que le fichier a bien un nom "filename" et on va stocker ce fichier sur le disque et afficher un message si cela a bien fonctionner.

Si vous savez un peu programmez vous n'aurez pas de problème. Les experts en programmation Python pourront y trouver à redire (pas d'exception ? try ? catch ?), mais le but de cet exercice est de se familiariser avec mod_python.

Comment faire des fichiers Python les fichiers par défaut ?

Vous avez remarqué que si vous ne mentionnez pas explicitement index.py , le fichier ne sera pas pris par défaut par Apache. Or vous aurez peut-être envie que votre site soit sous la forme www.mon-site.com et non www.mon-site.com/index.py .

Il est possible de modifier ce comportement en ajoutant cette ligne au fichier httpd.conf :

DirectoryIndex index.html index.py

En clair, le serveur va regarder si un fichier index.html existe et sinon se tournera vers un fichier index.py. N'oubliez pas de redémarrer Apache après avoir effectué la modification du fichier de configuration.

Et voilà ! Libre à vous d'améliorer ce script afin d'aller plus loin pour construire complètement votre application web Python. Mais je ne vous laissez pas pour autant car je vois qu'il y a encore quelques sceptiques...

Pourquoi utiliser mod_python et pas CGI ?

Il s'agit d'une bonne question. La réponse simple c'est tout simplement que mod_python est optimisé pour Apache et qu'il est du coup beaucoup plus rapide qu'un simple CGI !

En effet, en fonctionnement CGI, Apache charge un interpréteur Python pour chaque requête faite sur le serveur.

Par contre, mod_python permet à Apache de charger Python, de le conserver en mémoire et de le réutiliser chaque fois qu'une nouvelle requête est faite. En claire, on gagne sur tous les plans avec des scripts et application web plus rapides.

Mais, il peut y avoir des inconvénients. Car mod_python est parfaitement intégré à Apache. Si votre code fonctionne mal pour cause de bug, cela peut faire planter Apache et un redémarrage sera nécessaire pour ce sortir de ce mauvais pas.

En clair, il faudra voir si mod_python correspond vraiment à vos besoins. Pour ceux, qui connaissent le langage Python et qui ont un peu d'expérience avec le serveur HTTP Apache, cela semble être un bon outil pour débuter.

Pourquoi utiliser Python pour le web ?

Encore une bonne question, mais qui n'a pas de réponse toute faite.

Si vous êtes à l'aise avec PHP et très productif, il n'y a pas de raison de changer. Si, par contre, vous vous sentez limité par PHP ou que vous avez déjà de l'expérience en programmation Python, alors c'est un bon choix !

Utilisez Python est aussi un excellent choix de part son grand nombre de librairies déjà disponibles et faciles à installer. (à condition d'avoir un serveur dédié)

Le mot de la fin

Merci de m'avoir lu jusqu'ici. Je ne suis pas un grand spécialiste du monde Python, mais j'ai pensé que partager ce type d'information pouvait être utile à d'autres.

Cet article sera complété au fur et à mesure de l'avancement de mes travaux et essais sur Python, Apache et mod_python.

N'hésitez pas à m'encourager en partageant cet article (s'il vous a plu) et en me laissant un commentaire.

Voici quelques liens sur les sujets évoqués sur cette page :

Pour d'autres articles, cliquez ICI.