Développement web rapide en python

Python logo

Image via Wikipedia

Java souffre d’une lourdeur incompatible avec le prototypage d’application web. En effet nous entendons par prototypage le fait de réaliser rapidement une application qui sera dans ce cas précis en mode web. Java impose une architecture robuste mais incompatible avec un développement rapide. Il oblige ainsi à « packager » l’application dans un war déployé dans un conteneur (ex: Tomcat). Java manque tout simplement d’agilité comparé à php pour le développement web.

Pour autant php est trop orienté web et ne va pas bien s’adapter en cas de monté en puissance. En effet comment partager le code en ayant la richesse du paradigme objet ou comment faire s’exécuter du code en dehors d’un contexte web ? Ce que Java propose…

Python peut être une alternative qui présente le meilleur des 2 mondes: puissance de l’objet pour la maintenabilité, la réutilisation et la rapidité du prototypage avec un langage de script. C’est ce que mod_python propose en ajoutant au serveur apache la capacité à exécuter du code python.

Le paquet mod_python est disponible depuis le dépôt officiel de Ubuntu 10.10. Une fois installé il faut déclarer dans apache une url qui va devenir python-aware. Pour cela il suffit de se rendre dans le répertoire de configuration de apache pour y créer le fichier /etc/apache2/con.d/replay en supposant que l’on veuille faire une application web qui s’appelle replay.

Alias /replay /home/thierry/Vidéos/n900
<Location /replay>
        Order Allow,Deny
        Allow from 192.168.0.0/255.255.0.0
        AddHandler mod_python .psp .psp_ .py
        PythonHandler mod_python.psp | .psp .psp_
        PythonHandler mod_python.publisher | .py
        PythonDebug On
</Location>

Ce fichier nous permet de déclarer l’url /replay qui devient pythonique ! Les url de la forme /replay/*.psp seront servies par le moteur de page Python Server Page (équivalent des JSP) tandis que celles de la forme /replay/*.py seront exécutées comme des scriptes pythons (équivalent des servlet).
Les url de la forme /replay/*.psp_ permettent d’afficher le code source des pages .psp à côté du scripye python généré à des fins de débogage. Étant donné qu’on active le mode debug, le fichier restreint l’accès aux url au réseau local.

Python Server Page

Voici un exemple de page PSP:

<html>
<table width="100%">
<tr bgcolor="grey">
<th>Queue</th>
</tr>
<tr>
<td>
<%
# Etat du processus de conversion
%>

<table width="100%">
<tr>
<th>Fichier</th><th>Taille</th><th>Etat</th><th>Action</th>
</tr>
<%
import os
import os.path
list = os.listdir("/home/thierry/Vidéos/n900")
work_in_progress  = ""
if os.path.exists("/home/thierry/Vidéos/n900/.work_in_progress") :
  f = open("/home/thierry/Vidéos/n900/.work_in_progress", "r");
  work_in_progress = f.read()
  f.close()
for f in list:
  if f.endswith(".ts"):
    filename = unicode(f,'utf')
    is_work_in_progress = work_in_progress.rpartition('.mp4')[0].endswith(f)
    etat = "En attente"
    if is_work_in_progress :
      etat = "En cours"
%>
<%
    # ferme le bloc if
%>

<tr>
<td><%=filename.encode('ascii','xmlcharrefreplace')%></td><td><%=os.path.getsize("/home/thierry/Vidéos/n900/" + f)%></td><td><%=etat%></td>
<td>
<form action="action.py/remove_queue" method="POST">
<input type="hidden" name="file" value="<%=filename.encode('ascii','xmlcharrefreplace')%>">
<input type="submit" value="supprimer">
</form>
</td>
</tr>
<%
# ferme le bloc for
%>

</table>

</td>
</tr>
</table>
</html>

Retenons que le code python s’écrit dans la page PSP comme les scriptlet java dans les pages JSP. On est loin de l’industrialisation de J2EE, il n’y a pas de notion de taglib, c’est du rustique ! Attention à l’indentation pour que le générateur de code ferme un bloc il est nécessaire d’avoir une instruction qui de-indente i.e ferme le bloc précédent. Pour cela il faudra parfois ajouter une code vide avec la nouvelle indentation ou mieux avec un commentaire qui explique notre intention.

Scripte .py

Il s’agit des actions de l’application web pour reprendre la terminologie Struts.  Le gstionnaire mod_python.publisher va interpréter une url telle que /replay/action.py/remove_queue comme devant être traitée par la fonction remove_queue du module action.py. Les paramètres passées lors de l’appel à l’url seront passés à la fonction.

Voici un exemple de « servlet python » à placer à l’url /replay/action.py:

# -*- encoding: UTF-8 -*-
import os
import os.path
from mod_python import util

def remove_queue(req,file=None):
  list = os.listdir("/home/thierry/Vidéos/n900")
  for f in list:
    if f.endswith(".ts"):
      if file:
        if file==unicode(f,'utf').encode('ascii','xmlcharrefreplace'):
          os.remove("/home/thierry/Vidéos/n900/" + f)
      else:
        os.remove("/home/thierry/Videos/n900/" + f)

  util.redirect(req,"../queue.psp")

La fonction doit se terminer par une redirection vers une vue qui n’est autre qu’une page PSP !

Cet article, publié dans Langage, est tagué , , . Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s