Chapitre 17 : Applications web▲
Vous avez certainement d�j� appris par ailleurs un grand nombre de choses concernant la
r�daction de pages web. Vous savez que ces pages sont des documents au format HTML, que l'on
peut consulter via un r�seau (intranet ou internet) � l'aide d'un logiciel appel� browser web ou
navigateur (Netscape, Konqueror, Internet explorer, ...).
Les pages HTML sont install�es dans les r�pertoires publics d'un autre ordinateur o� fonctionne
en permanence un logiciel appel� serveur Web (Apache, IIS, Zope, ...). Lorsqu'une connexion a �t�
�tablie entre cet ordinateur et le v�tre, votre logiciel navigateur peut dialoguer avec le logiciel
serveur (par l'interm�diaire de toute une s�rie de dispositifs mat�riels et logiciels dont nous ne
traiterons pas ici : lignes t�l�phoniques, routeurs, caches, protocoles de communication ...).
Le protocole HTTP qui g�re la transmission des pages web autorise l'�change de donn�es dans
les deux sens. Mais dans la grande majorit� des cas, le transfert d'informations n'a pratiquement lieu
que dans un seul, � savoir du serveur vers le navigateur : des textes, des images, des fichiers divers
lui sont exp�di�s en grand nombre (ce sont les pages consult�es) ; en revanche, le navigateur
n'envoie gu�re au serveur que de toutes petites quantit�s d'information : essentiellement les adresses
URL des pages que l'internaute d�sire consulter.
17.1. Pages web interactives▲
Vous savez cependant qu'il existe des sites web o� vous �tes invit� � fournir vous-m�me des
quantit�s d'information plus importantes : vos r�f�rences personnelles pour l'inscription � un club
ou la r�servation d'une chambre d'h�tel, votre num�ro de carte de cr�dit pour la commande d'un
article sur un site de commerce �lectronique, votre avis ou vos suggestions, etc.
Dans un cas comme ceux-l�, vous vous doutez bien que l'information transmise doit �tre prise en
charge, du c�t� du serveur, par un programme sp�cifique. Il faut donc que les pages web destin�es �
accueillir cette information soient dot�es d'un m�canisme assurant son transfert vers le logiciel
destin� � la traiter. Il faudra �galement que ce logiciel puisse lui-m�me transmettre en retour une
information au serveur, afin que celui-ci puisse pr�senter le r�sultat de l'op�ration � l'internaute,
sous la forme d'une nouvelle page web.
Le but du pr�sent chapitre est de vous expliquer comment vous pouvez vous servir de vos
comp�tences de programmeur Python pour ajouter une telle interactivit� � un site web, en y
int�grant de v�ritables applications.
Remarque importante : Ce que nous allons expliquer dans les paragraphes qui suivent sera
directement fonctionnel sur l'intranet de votre �tablissement scolaire ou de votre entreprise (� la
condition toutefois que l'administrateur de cet intranet ait configur� son serveur de mani�re
appropri�e). En ce qui concerne l'internet, par contre, les choses sont un peu plus compliqu�es. Il va
de soi que l'installation de logiciels sur un ordinateur serveur reli� � l'internet ne peut se faire
qu'avec l'accord de son propri�taire. Si un fournisseur d'acc�s � l'internet a mis a votre disposition
un certain espace o� vous �tes autoris� � installer des pages web � statiques � (c'est-�-dire de
simples documents � consulter), cela ne signifie pas pour autant que vous pourrez y faire
fonctionner des scripts Python. Pour que cela puisse marcher, vous devrez demander une
autorisation et un certain nombre de renseignements � votre fournisseur d'acc�s. Il faudra en
particulier lui demander si vous pouvez activer des scripts CGI �crits en Python � partir de vos
pages, et dans quel(s) r�pertoire(s) vous pouvez les installer.
17.2. L'interface CGI▲
L'interface CGI (pour Common Gateway Interface) est un composant de la plupart des logiciels
serveurs de pages web. Il s'agit d'une passerelle qui leur permet de communiquer avec d'autres
logiciels tournant sur le m�me ordinateur. Avec CGI, vous pouvez �crire des scripts dans diff�rents
langages (Perl, C, Tcl, Python ...).
Plut�t que de limiter le web � des documents �crits � l'avance, CGI permet de g�n�rer des pages
web sur le champ, en fonction des donn�es que fournit l'internaute par l'interm�diaire de son
logiciel de navigation. Vous pouvez utiliser les scripts CGI pour cr�er une large palette
d'applications : des services d'inscription en ligne, des outils de recherche dans des bases de
donn�es, des instruments de sondage d'opinions, des jeux, etc.
L'apprentissage de la programmation CGI peut faire l'objet de manuels entiers. Dans cet ouvrage
d'initiation, nous vous expliquerons seulement quelques principes de base, afin de vous faire
comprendre, par comparaison, l'�norme avantage que pr�sentent les modules serveurs d'applications
sp�cialis�s tels que Karrigell, CherryPy ou Zope, pour le programmeur d�sireux de d�velopper un
site web interacif.
17.2.1. Une interaction CGI rudimentaire▲
Pour la bonne compr�hension de ce qui suit, nous supposerons que l'administrateur r�seau de
votre �tablissement scolaire ou de votre entreprise a configur� un serveur web d'intranet d'une
mani�re telle que vous puissiez installer des pages HTML et des scripts Python dans un r�pertoire
personnel.
Notre premier exemple sera constitu� d'une page web extr�mement simple. Nous n'y placerons
qu'un seul �l�ment d'interactivit�, � savoir un unique bouton. Ce bouton servira � lancer l'ex�cution
d'un petit programme que nous d�crirons par apr�s.
Veuillez donc encoder le document HTML ci-dessous � l'aide d'un �diteur quelconque
(n'encodez pas les num�ros de lignes, ils ne sont l� que pour faciliter les explications qui suivent) :
1
. <
HTML>
2
. <
HEAD>
<
TITLE>
Exercice avec Python<
/
TITLE>
<
/
HEAD>
3
. <
BODY>
4
.
5
. <
DIV ALIGN=
"
center
"
>
6
. <
IMG SRC=
"
penguin
.
gif
"
>
7
. <
H2>
Page Web interactive<
/
H2>
8
. <
P>
Cette page est associ�e � un script Python<
/
P>
9
.
10
.<
FORM ACTION=
"
http
:
/
/
Serveur
/
cgi
-
bin
/
input_query
.
py
"
METHOD=
"
post
"
>
11
.<
INPUT TYPE=
"
submit
"
NAME=
"
send
"
VALUE=
"
Ex�cuter
le
script
"
>
12
.<
/
FORM>
13
.
14
.<
/
DIV>
<
/
BODY>
<
/
HTML>
Vous savez certainement d�j� que les balises initiales <HTML>, <HEAD>, <TITLE>,
<BODY>, ainsi que les balises finales correspondantes, sont communes � tous les documents
HTML. Nous ne d�taillerons donc pas leur r�le ici.
La balise <DIV> utilis�e � la ligne 5 sert habituellement � diviser un document HTML en
sections distinctes. Nous l'utilisons ici pour d�finir une section dans laquelle tous les �l�ments
seront centr�s (horizontalement) sur la page.
A la ligne 6, nous ins�rons une petite image.
La ligne 7 d�finit une ligne te texte comme �tant un titre de 2e importance.
La ligne 8 est un paragraphe ordinaire.
Les lignes 10 � 12 contiennent le code important (pour ce qui nous occupe ici). Les balises
<FORM> et </FORM> d�finissent en effet un formulaire, c'est-�-dire une portion de page Web
susceptible de contenir divers widgets � l'aide desquels l'internaute pourra exercer une certaine
activit� : champs d'entr�e, boutons, cases � cocher, boutons radio, etc.
La balise FORM doit contenir deux indications essentielles : l'action � accomplir lorsque le
formulaire sera exp�di� (il s'agit en fait de fournir ici l'adresse URL du logiciel � invoquer pour
traiter les donn�es transmises), et la m�thode � utiliser pour transmettre l'information (en ce qui
nous concerne, ce sera toujours la m�thode � post �).
Dans notre exemple, le logiciel que nous voulons invoquer est un script Python nomm�
input_query.py qui est situ� dans un r�pertoire particulier du serveur d'intranet. Sur de nombreux
serveurs, ce r�pertoire s'appelle souvent cgi-bin , par pure convention. Nous supposerons ici que
l'administrateur de votre intranet scolaire vous autorise � installer vos scripts Python dans le m�me
r�pertoire que celui o� vous placez vos pages Web personnelles.
Vous devrez donc modifier la ligne 10 de notre exemple, en rempla�ant l'adresse
http://Serveur/cgi-bin/input_query.py par ce que votre professeur vous indiquera68.
La ligne 11 contient la balise qui d�finit un widget de type � bouton d'envoi � (balise <INPUT
TYPE="submit">). Le texte qui doit appara�tre sur le bouton est pr�cis� par l'attribut VALUE
="texte". L'indication NAME est facultative dans le cas pr�sent. Elle mentionne le nom du widget
lui-m�me (au cas o� le logiciel destinataire en aurait besoin).
Lorsque vous aurez termin� l'encodage de ce document, sauvegardez-le dans le r�pertoire que
l'on vous a attribu� sp�cifiquement pour y placer vos pages, sous un nom quelconque, mais de
pr�f�rence avec l'extension .html ou .htm (par exemple : essai.html).
Le script Python input_query.py est d�taill� ci-dessous. Comme d�j� signal� plus haut, vous
pouvez installer ce script dans le m�me r�pertoire que votre document HTML initial :
1
. #
!
/usr/bin/python
2
.
3
. #
Affichage
d'un
formulaire
HTML
simplifi�
:
4
. print
"
Content
-
Type
:
text
/
html\n
"
5
. print
"""
6
.
<
H3
>
<
FONT
COLOR
=
"
Royal
blue
"
>
7
.
Page
web
produite
par
un
script
Python
8
.
<
/
FONT
>
<
/
H3
>
9
.
10
.
<
FORM
ACTION
=
"
print_result
.
py
"
METHOD
=
"
post
"
>
11
.
<
P
>
Veuillez
entrer
votre
nom
dans
le
champ
ci
-
dessous
,
s
.
v
.
p
.
:
<
/
P
>
12
.
<
P
>
<
INPUT
NAME
=
"
visiteur
"
SIZE
=
20
MAXLENGTH
=
20
TYPE
=
"
text
"
>
<
/
P
>
13
.
<
P
>
Veuillez
�galement
me
fournir
une
phrase
quelconque
:
<
/
P
>
14
.
<
TEXTAREA
NAME
=
"
phrase
"
ROWS
=
2
COLS
=
50
>
Mississippi
<
/
TEXTAREA
>
15
.
<
P
>
J
'
utiliserai
cette
phrase
pour
�tablir
un
histogramme
.
<
/
P
>
16
.
<
INPUT
TYPE
=
"
submit
"
NAME
=
"
send
"
VALUE
=
"
Action
"
>
17
.
<
/
FORM
>
18
.
"""
Ce script ne fait rien d'autre que d'afficher une nouvelle page web, laquelle contient encore une
fois un formulaire, mais celui-ci nettement plus �labor� que le pr�c�dent.
La premi�re ligne est absolument n�cessaire : elle indique � l'interface CGI qu'il faut lancer
l'interpr�teur Python pour pouvoir ex�cuter le script. La seconde ligne est un simple commentaire.
La ligne 4 est indispensable. Elle permet � l'interpr�teur Python d'initialiser un v�ritable
document HTML qui sera transmis au serveur web. Celui-ci pourra � son tour le r�exp�dier au
logiciel navigateur de l'internaute, et celui-ci le verra donc s'afficher dans la fen�tre de navigation.
La suite est du pur code HTML, trait� par Python comme une simple cha�ne de caract�res que
l'on affiche � l'aide de l'instruction print. Pour pouvoir y ins�rer tout ce que nous voulons, y
compris les sauts � la ligne, les apostrophes, les guillemets, etc., nous d�limitons cette cha�ne de
caract�res � l'aide de � triples guillemets � (Rappelons �galement ici que les sauts � la ligne sont
compl�tement ignor�s en HTML : nous pouvons donc en utiliser autant que nous voulons pour
� a�rer � notre code et le rendre plus lisible).
68 Par exemple : http://192.168.0.100/cgi/Classe6A/Dupont/input_query.py .
17.2.2. Un formulaire HTML pour l'acquisition des donn�es▲
Analysons � pr�sent le code HTML lui-m�me. Nous y trouvons essentiellement un nouveau
formulaire, qui comporte plusieurs paragraphes, parmi lesquels on peut reconna�tre quelques
widgets. La ligne 10 indique le nom du script CGI auquel les donn�es du formulaire seront
transmises : il s'agira bien �videmment d'un autre script Python.
A la ligne 12, on trouve la d�finition d'un widget de type � champ d'entr�e � (Balise INPUT,
avec TYPE="text"). L'utilisateur est invit� � y encoder son nom. Le param�tre MAXLENGTH
d�finit une longueur maximale pour la cha�ne de caract�res qui sera entr�e ici (20 caract�res, en
l'occurrence). Le param�tre SIZE d�finit la taille du champ tel qu'il doit appara�tre � l'�cran, et le
param�tre NAME est le nom que nous choisissons pour la variable destin�e � m�moriser la cha�ne
de caract�res attendue.
Un second champ d'entr�e un peu diff�rent est d�fini � la ligne 14 (balise TEXTAREA). Il s'agit
d'un r�ceptacle plus vaste, destin� � accueillir des textes de plusieurs lignes. (Ce champ est
automatiquement pourvu d'ascenseurs si le texte � ins�rer se r�v�le trop volumineux). Ses
param�tres ROWS et COLS sont assez explicites. Entre les balises initiale et finale, on peut ins�rer
un texte par d�faut (� Mississippi � dans notre exemple).
Comme dans l'exemple pr�c�dent, la ligne 16 contient la d�finition du bouton qu'il faudra
actionner pour transmettre les donn�es au script CGI destinataire, lequel est d�crit ci-apr�s.
17.2.3. Un script CGI pour le traitement des donn�es▲
Le m�canisme utilis� � l'int�rieur d'un script CGI pour r�ceptionner les donn�es transmises par un formulaire HTML est fort simple, comme vous pouvez l'analyser dans l'exemple ci-dessous :
1
. #
!
/usr/bin/python
2
. #
Traitement
des
donn�es
transmises
par
un
formulaire
HTML
3
.
4
. import
cgi #
Module
d'interface
avec
le
serveur
web
5
. form =
cgi.FieldStorage
() #
R�ception
de
la
requ�te
utilisateur
:
6
. #
il
s'agit
d'une
sorte
de
dictionnaire
7
. if
form.has_key
("
phrase
"
): #
La
cl�
n'existera
pas
si
le
champ
8
. text =
form["
phrase
"
].value #
correspondant
est
rest�
vide
9
. else
:
10
. text =
"
*
*
*
le
champ
phrase
�tait
vide
!
*
*
*
"
11
.
12
.if
form.has_key
("
visiteur
"
): #
La
cl�
n'existera
pas
si
le
champ
13
. nomv =
form["
visiteur
"
].value #
correspondant
est
rest�
vide
14
.else
:
15
. nomv =
"
mais
vous
ne
m
'
avez
pas
indiqu�
votre
nom
"
16
.
17
.print
"
Content
-
Type
:
text
/
html\n
"
18
.print
"""
19
.
<
H3
>
Merci
,
%s
!
<
/
H3
>
20
.
<
H4
>
La
phrase
que
vous
m
'
avez
fournie
�tait
:
<
/
H4
>
21
.
<
H3
>
<
FONT
Color
=
"
red
"
>
%s
<
/
FONT
>
<
/
H3
>
"""
%
(nomv, text)
22
.
23
.histogr =
{}
24
.for
c in
text:
25
. histogr[c] =
histogr.get
(c, 0
) +
1
26
.
27
.liste =
histogr.items
() #
conversion
en
une
liste
de
tuples
28
.liste.sort
() #
tri
de
la
liste
29
.print
"
<
H4
>
Fr�quence
de
chaque
caract�re
dans
la
phrase
:
<
/
H4
>
"
30
.for
c, f in
liste:
31
. print
'
le
caract�re
<
B
>
"
%s
"
<
/
B
>
appara�t
%s
fois
<
BR
>
'
%
(c, f)
Les lignes 4 et 5 sont les plus importantes :
Le module cgi import� � la ligne 4 assure la connexion du script Python avec l'interface CGI ,
laquelle permet de dialoguer avec le serveur web.
A la ligne 5, la fonction FieldStorage() de ce module renvoie un objet qui contient l'ensemble
des donn�es transmises par le formulaire HTML. Nous pla�ons cet objet, lequel est assez semblable
� un dictionnaire classique, dans la variable form.
Par rapport � un v�ritable dictionnaire, l'objet plac� dans form pr�sente la diff�rence essentielle
qu'il faudra lui appliquer la m�thode value() pour en extraire les donn�es. Les autres m�thodes
applicables aux dictionnaires, telles la m�thode has_key() , par exemple, peuvent �tre utilis�es de la
mani�re habituelle.
Une caract�ristique importante de l'objet dictionnaire retourn� par FieldStorage() est qu'il ne
poss�dera aucune cl� pour les champs laiss�s vides dans le formulaire HTML correspondant.
Dans notre exemple, le formulaire comporte deux champs d'entr�e, auxquels nous avons associ�
les noms � visiteur � et � phrase �. Si ces champs ont effectivement �t� compl�t�s par l'utilisateur,
nous trouverons leurs contenus dans l'objet dictionnaire, aux index � visiteur � et � phrase �. Par
contre, si l'un ou l'autre de ces champs n'a pas �t� compl�t�, l'index correspondant n'existera tout
simplement pas. Avant toute forme de traitement de valeurs, il est donc indispensable de s'assurer
de la pr�sence de chacun des index attendus, et c'est ce que nous faisons aux lignes 7 � 15.
(17) Exercice :
17.1. Pour v�rifier ce qui pr�c�de, vous pouvez par exemple d�sactiver (en les transformant en
commentaires) les lignes 7, 9, 10, 12, 14 & 15 du script. Si vous testez le fonctionnement
de l'ensemble, vous constaterez que tout se passe bien si l'utilisateur compl�te effectivement
les champs qui lui sont propos�s. Si l'un des champs est laiss� vide, par contre, une erreur
se produit.
Note importante : le script �tant lanc� par l'interm�diaire d'une page web, les messages d'erreur
de Python ne seront pas affich�s dans cette page, mais plut�t enregistr�s dans le journal des
�v�nements du serveur web. Veuillez consulter l'administrateur de ce serveur pour savoir comment
vous pouvez acc�der � ce journal. De toute mani�re, attendez-vous � ce que la recherche des erreurs
dans un script CGI soit plus ardue que dans une application ordinaire.
Le reste du script est assez classique.
- Aux lignes 17 � 21, nous ne faisons qu'afficher les donn�es transmises par le formulaire.
Veuillez noter que les variables nomv et text doivent exister au pr�alable, ce qui rend
indispensables les lignes 9, 10, 14 & 15.
- Aux lignes 23, 24 & 25, nous nous servons d'un dictionnaire pour construire un histogramme
simple, comme nous l'avons expliqu� � la page 149.
- A la ligne 27, nous convertissons le dictionnaire r�sultant en une liste de tuples, pour pouvoir
trier celle-ci dans l'ordre alphab�tique � la ligne 28.
- La boucle for des lignes 30 et 31 se passe de commentaires.
17.3. Un serveur web en pur Python !▲
Dans les pages pr�c�dentes, nous vous avons expliqu� quelques rudiments de programmation
CGI afin que vous puissiez mieux comprendre comment fonctionne une application web. Mais si
vous voulez v�ritablement d�velopper une telle application (par exemple un site web personnel dot�
d'une certaine interactivit�), vous constaterez rapidement que l'interface CGI est un outil trop
sommaire. Son utilisation telle quelle dans des scripts se r�v�le fort lourde, et il est donc pr�f�rable
de faire appel � des outils plus �labor�s.
L'int�r�t pour le d�veloppement web est devenu tr�s important, et il existe donc une forte
demande pour des interfaces et des environnements de programmation bien adapt�s � cette t�che.
Or, m�me s'il ne peut pas pr�tendre � l'universalit� de langages tels que C/C++, Python est d�j�
largement utilis� un peu partout dans le monde pour �crire des programmes tr�s ambitieux, y
compris dans le domaine des serveurs d'applications web. La robustesse et la facilit� de mise en
oeuvre du langage ont s�duit de nombreux d�veloppeurs de talent, qui ont r�alis� des outils de
d�veloppement web de tr�s haut niveau. Plusieurs de ces applications peuvent vous int�resser si
vous souhaitez r�aliser vous-m�me des sites web interactifs de diff�rents types.
Les produits existants sont pour la plupart des logiciels libres. Ils permettent de couvrir une large
gamme de besoins, depuis le petit site personnel de quelques pages, jusqu'au gros site commercial
collaboratif, capable de r�pondre � des milliers de requ�tes journali�res, et dont les diff�rents
secteurs sont g�r�s sans interf�rence par des personnes de comp�tences vari�es (infographistes,
programmeurs, sp�cialistes de bases de donn�es, etc.).
Le plus c�l�bre de ces produits est le logiciel Zope, d�j� adopt� par de grands organismes priv�s
et publics pour le d�veloppement d'intranets et d'extranets collaboratifs. Il s'agit en fait d'un syst�me
serveur d'applications, tr�s performant, s�curis�, presqu'enti�rement �crit en Python, et que l'on peut
administrer � distance � l'aide d'une simple interface web. Il ne nous est pas possible de d�crire
l'utilisation de Zope dans ces pages : le sujet est trop vaste, et un livre entier n'y suffirait pas.
Sachez cependant que ce produit est parfaitement capable de g�rer de tr�s gros sites d'entreprise en
offrant d'�normes avantages par rapport � des solutions classiques telles que PHP ou Java.
D'autres outils moins ambitieux mais tout aussi int�ressants sont disponibles. Tout comme Zope,
la plupart d'entre eux peuvent �tre t�l�charg�s librement depuis l'internet. Le fait qu'ils soient �crits
en Python assure en outre leur portabilit� : vous pourrez donc les employer aussi bien sous
Windows que sous Linux ou MacOs. Chacun d'eux peut �tre utilis� en conjonction avec un serveur
web � classique � tel que Apache ou Xitami (c'est pr�f�rable si le site � r�aliser est destin� �
supporter une charge de connexions tr�s importante), mais certains d'entre eux int�grent en outre
leur propre serveur web, ce qui leur permet de fonctionner �galement de mani�re tout � fait
autonome. Cette possibilit� se r�v�le particuli�rement int�ressante au cours de la mise au point d'un
site, car elle facilite la recherche des erreurs.
Cette totale autonomie alli�e � la grande facilit� de leur mise en oeuvre fait de ces produits de
fort bonnes solutions pour la r�alisation de sites web d'intranet sp�cialis�s, notamment dans des
petites et moyennes entreprises, des administrations, ou dans des �coles. Si vous souhaitez
d�velopper une application Python qui soit accessible par l'interm�diaire d'un simple navigateur
web, via un intranet d'entreprise (ou m�me via l'internet, si la charge pr�visible n'est pas trop
importante), ces applications sont faites pour vous.
Il en existe une grande vari�t� : Poor man's Zope, Spyce, Karrigell, Webware, Cherrypy,
Quixote, Twisted, etc. Choisissez en fonction de vos besoins : vous n'aurez que l'embarras du choix.
Dans les lignes qui suivent, nous allons d�crire une petite application web fonctionnant � l'aide
de Karrigell. Vous pouvez trouver ce syst�me � l'adresse : http://karrigell.sourceforge.net. Il s'agit
d'une solution de d�veloppement web simple, bien document�e en anglais et en fran�ais (son
auteur, Pierre Quentel, est en effet originaire de Bretagne, tout comme le mot karrigell, d'ailleurs,
lequel signifie � charrette �).
17.3.1. Installation de Karrigell▲
L'installation de Karrigell est un jeu d'enfant : il vous suffit d'extraire dans un r�pertoire
quelconque le fichier archive que vous aurez t�l�charg� depuis l'internet. L'op�ration de
d�sarchivage cr�e automatiquement un sous-r�pertoire nomm� Karrigell-num�ro de version. C'est
ce r�pertoire que nous consid�rerons comme r�pertoire racine dans les lignes qui suivent.
Si vous ne comptez pas utiliser le serveur de bases de donn�es Gadfly69 qui vous est fourni en
compl�ment de Karrigell lui-m�me, c'est tout ! Sinon, entrez dans le sous-r�pertoire gadfly-1.0.0 et
lancez la commande : python setup.py install (Sous Linux, il faut �tre root). Vous devez
effectuer cette op�ration si vous souhaitez visualiser la totalit� de la d�monstration int�gr�e.
69 Voyez le chapitre pr�c�dent : Gadfly est un serveur de bases de donn�es �crit en Python.
17.3.2. D�marrage du serveur :▲
Il s'agit donc bel et bien de mettre en route un serveur web, auquel vous pourrez acc�der ensuite
� l'aide d'un navigateur quelconque, localement ou par l'interm�diaire d'un r�seau. Avant de le faire
d�marrer, il est cependant conseill� de jeter un petit coup d'oeil dans son fichier de configuration,
lequel se nomme Karrigell.ini et se trouve dans le r�pertoire-racine.
Par d�faut, Karrigell attend les requ�tes http sur le port n� 80. Et c'est bien ce num�ro de port
que la plupart des logiciels navigateurs utilisent eux-m�mes par d�faut. Cependant, si vous installez
Karrigell sur une machine Linux dont vous n'�tes pas l'administrateur, vous n'avez pas le droit
d'utiliser les num�ros de port inf�rieurs � 1024 (pour des raisons de s�curit�). Si vous �tes dans ce
cas, vous devez donc modifier le fichier de configuration afin que Karrigell utilise un num�ro de
port plus �lev�. En g�n�ral, vous choisirez d'enlever simplement le caract�re # au d�but de la ligne
39, ce qui activera l'utilisation du n� de port 8080. Plus tard, vous souhaiterez peut-�tre encore
modifier le fichier de configuration afin de modifier l'emplacement du r�pertoire racine pour votre
site web (par d�faut, c'est le r�pertoire du serveur lui-m�me).
Une fois le fichier de configuration modifi�, entrez dans le r�pertoire racine du serveur, si vous
n'y �tes pas d�j�, et lancez simplement la commande :
python Karrigell.py
C'est tout. Votre serveur Karrigell se met en route, et vous pouvez en v�rifier le fonctionnement
tout de suite � l'aide de votre navigateur web pr�f�r�. Si vous lancez celui-ci sur la m�me machine
que le serveur, vous le dirigerez vers une adresse telle que : http://localhost:8080/index.html,
� localhost � �tant le terme consacr� pour d�signer la machine locale, � 8080 � le num�ro de port
choisi dans le fichier de configuration, et � index.html � le nom du fichier qui contient la page
d'accueil du site. Par contre, si vous voulez acc�der � cette m�me page d'accueil depuis une autre
machine, vous devrez (dans le navigateur de celle-ci) indiquer le nom ou l'adresse IP du serveur, en
lieu et place de localhost.
Avec l'adresse indiqu�e au paragraphe pr�c�dent70, vous atteindrez la page d'accueil d'un site de
d�monstration de Karrigell, qui est d�j� pr�-install� dans le r�pertoire racine. Vous y retrouverez la
documentation de base, ainsi que toute une s�rie d'exemples.
Dans ce qui pr�c�de, il est sous-entendu que vous avez lanc� le serveur depuis une console texte,
ou depuis une fen�tre de terminal. Dans un cas comme dans l'autre, les messages de contr�le �mis
par le serveur appara�tront dans cette console ou cette fen�tre. C'est l� que vous pourrez rechercher
des messages d'erreur �ventuels. C'est l� aussi que vous devrez intervenir si vous voulez arr�ter le
serveur (avec la combinaison de touches CTRL-C).
70 Si vous avez laiss� en place le n� de port par d�faut (80), il est inutile de le rappeler dans les adresses, puisque c'est ce n� de port qui est utilis� par d�faut par la plupart des navigateurs. Une autre convention consiste � consid�rer que la page d'accueil d'un site Web se trouve presque toujours dans un fichier nomm� index.htm ou index.html, Lorsque l'on souhaite visiter un site Web en commen�ant par sa page d'accueil, on peut donc en g�n�ral omettre ce nom dans l'adresse. Karrigell respecte cette convention, et vous pouvez donc vous connecter en utilisant une adresse simplifi�e telle que : http://localhost:8080 ou m�me : http://localhost (si le n� de port est 80).
17.3.3. �bauche de site web▲
Essayons � pr�sent de r�aliser notre propre �bauche de site web. � la diff�rence d'un serveur web classique, Karrigell peut g�rer non seulement des pages HTML statiques (fichiers .htm, .html, .gif, . jpg, .css) mais �galement :
- des scripts Python (fichiers .py)
- des scripts hybrides Python Inside HTML (fichiers .pih)
- des scripts hybrides HTML Inside Python (fichiers .hip)
Laissons de c�t� les scripts hybrides, dont vous pourrez �tudier vous-m�me la syntaxe (par
ailleurs tr�s simple) si vous vous lancez dans une r�alisation d'une certaine importance (ils pourront
vous faciliter la vie). Dans le contexte limit� de ces pages, nous nous contenterons de quelques
exp�riences de base avec des scripts Python ordinaires.
Comme tous les autres �l�ments du site (fichiers .html, .gif, .jpeg, etc.), ces scripts Python
devront �tre plac�s dans le r�pertoire racine71. Vous pouvez tout de suite effectuer un test
�l�mentaire en r�digeant un petit script d'une seule ligne, tel que :
print
"
Bienvenue
sur
mon
site
web
!
"
Sauvegardez ce script sous le nom hello.py dans le r�pertoire racine, puis entrez l'adresse :
http://localhost/hello.py (ou m�me : http://localhost/hello - l'extension .py peut �tre omise) dans
votre navigateur. Vous devriez y voir appara�tre le message. Cela signifie donc que dans
l'environnement Karrigell, la sortie de l'instruction print est redirig�e vers la fen�tre du navigateur
client, plut�t que la console (ou la fen�tre de terminal) du serveur.
�tant donn� que l'affichage a lieu dans une fen�tre de navigateur web, vous pouvez utiliser toutes
les ressources de la syntaxe HTML afin d'obtenir un formatage d�termin�. Vous pouvez par
exemple afficher un petit tableau de 2 lignes et 3 colonnes, avec les instructions suivantes :
print
"""
<
TABLE
BORDER
=
"
1
"
CELLPADDING
=
"
5
"
>
<
TR
>
<
TD
>
Rouge
<
/
TD
>
<
TD
>
Vert
<
/
TD
>
<
TD
>
Bleu
<
/
TD
>
<
/
TR
>
<
TR
>
<
TD
>
15
%
<
/
TD
>
<
TD
>
62
%
<
/
TD
>
<
TD
>
23
%
<
/
TD
>
<
/
TR
>
<
/
TABLE
>
"""
Rappelons que la balise TABLE d�finit un tableau. Son option BORDER sp�cifie la largeur des bordures de s�paration, et CELLPADDING l'�cart � r�server autour du contenu des cellules. Les Balises TR et TD (Table Row et Table Data) d�finissent les lignes et les cellules du tableau.
Vous pouvez bien entendu utiliser �galement toutes
les ressources de Python, comme dans l'exemple cidessous
o� nous construisons une table des sinus,
cosinus et tangentes des angles compris entre 0� et
90�, � l'aide d'une boucle classique. Ligne 7 : Nous nous servons de la fonction range() pour d�finir la gamme d'angles � couvrir (de z�ro � 60 degr�s par pas de 10). Ligne 9 : Les fonctions trigonom�triques de Python n�cessitent que les angles soient exprim�s en radians. Il faut donc effectuer une conversion. Ligne 12 : Chaque ligne du tableau comporte quatre valeurs, lesquelles sont mises en forme � l'aide du syst�me de formatage des cha�nes de caract�res d�crit d�j� � la page 130 : le marqueur de conversion � %8.7f � force un affichage � 8 chiffres, dont 7 apr�s la � virgule � d�cimale. Le marqueur � %8.7g � fait � peu pr�s la m�me chose, mais passe � la notation scientifique lorsque c'est n�cessaire. |
![]() |
1
. from
math import
sin, cos, tan, pi
2
.
3
. #
Construction
de
l'en-t�te
du
tableau
avec
les
titres
de
colonnes
:
4
. print
"""
<
TABLE
BORDER
=
"
1
"
CELLPADDING
=
"
5
"
>
5
.
<
TR
>
<
TD
>
Angle
<
/
TD
>
<
TD
>
Sinus
<
/
TD
>
<
TD
>
Cosinus
<
/
TD
>
<
TD
>
Tangente
<
/
TD
>
<
/
TR
>
"""
6
.
7
. for
angle in
range
(0
,62
,10
):
8
. #
conversion
des
degr�s
en
radians
:
9
. aRad =
angle *
pi /
180
10
. #
construction
d'une
ligne
de
tableau,
en
exploitant
le
formatage
des
11
. #
cha�nes
de
caract�res
pour
fignoler
l'affichage
:
12
. print
"
<
TR
>
<
TD
>
%s
<
/
TD
>
<
TD
>
%
8
.
7f
<
/
TD
>
<
TD
>
%
8
.
7f
<
/
TD
>
<
TD
>
%
8
.
7g
<
/
TD
>
<
/
TR
>
"
\
13
. %
(angle, sin
(aRad), cos
(aRad), tan
(aRad))
14
.
15
.print
"
<
/
TABLE
>
"
� ce stade, vous vous demandez peut-�tre o� se situe la diff�rence entre ce que nous venons
d'exp�rimenter ici et un script CGI classique (tels ceux des pages 266 et suivantes).
L'int�r�t de travailler dans un environnement plus sp�cifique tel que Karrigell appara�t cependant
tr�s vite si vous faites des erreurs. En programmation CGI classique, les messages d'erreur �mis par
l'interpr�teur Python ne s'affichent pas dans la fen�tre du navigateur. Ils sont enregistr�s dans un
fichier journal du serveur (Apache, par exemple), ce qui ne facilite pas leur consultation.
Avec un outil comme Karrigell, par contre, vous disposez d'une signalisation tr�s efficace, ainsi
que d'un outil de d�boguage complet. Faites l'exp�rience d'introduire une petite erreur dans le script
ci-dessus, et relancez votre navigateur sur la page modifi�e. Par exemple, en supprimant le double
point � la fin de la ligne 7, nous avons obtenu nous-m�mes l'affichage suivant :

En cliquant sur le bouton � Debug �, on obtient encore une foule d'informations compl�mentaires (affichage du script complet, variables d'environnement, etc.).
71 ...ou bien dans des sous-r�pertoires du r�pertoire racine, comme il est d'usage de le faire lorsque l'on cherche � structurer convenablement le site en construction. Il vous suffira dans ce cas d'inclure le nom de ces sousr�pertoires dans les adresses correspondantes.
17.3.4. Prise en charge des sessions▲
Lorsque l'on �labore un site web interactif, on souhaite fr�quemment que la personne visitant le
site puisse s'identifier et fournir un certain nombre de renseignements tout au long de sa visite dans
diff�rentes pages (l'exemple type �tant le remplissage d'un � caddy � au cours de la consultation
d'un site commercial), toutes ces informations �tant conserv�es quelque part jusqu'� la fin de sa
visite. Et il faut bien entendu r�aliser cela ind�pendamment pour chaque client connect�.
Il serait possible de transmettre les informations de page en page � l'aide de champs de
formulaires cach�s, mais ce serait compliqu� et tr�s contraignant. Il est pr�f�rable que le syst�me
serveur soit dot� d'un m�canisme sp�cifique, qui attribue � chaque client une session particuli�re.
Karrigell r�alise cet objectif par l'interm�diaire de cookies. Lorsqu'un nouveau visiteur du site
s'identifie, le serveur g�n�re un cookie appel� sessionId et l'envoie au navigateur web, qui
l'enregistre. Ce cookie contient un � identifiant de session � unique, auquel correspond un objetsession
sur le serveur. Lorsque le visiteur parcourt les autres pages du site, son navigateur renvoie �
chaque fois le contenu du cookie au serveur, et celui-ci peut donc retrouver l'objet-session
correspondant, � l'aide de son identifiant. L'objet-session reste donc disponible tout au long de la
visite de l'internaute : il s'agit d'un objet Python ordinaire, dans lequel on m�morise un nombre
quelconque d'informations sous forme d'attributs.
Au niveau de la programmation, voici comment cela se passe :
Pour chaque page dans laquelle vous voulez consulter ou modifier une information de session, vous
commencez par cr�er un objet de la classe Session() :
objet_session =
Session
()
Si vous �tes au d�but de la session, Karrigell g�n�re un identifiant unique, le place dans un cookie et envoie celui-ci au navigateur web. Vous pouvez alors ajouter un nombre quelconque d'attributs � l'objet-session :
objet_session.nom =
"
Jean
Dupont
"
Dans les autres pages, vous proc�dez de la m�me mani�re, mais l'objet produit dans ce cas par la classe Session() n'est pas nouveau : c'est l'objet cr�� en d�but de session, retrouv� en interne par le serveur gr�ce � son identifiant relu dans le cookie. Vous pouvez acc�der aux valeurs de ses attributs, et aussi en ajouter de nouveaux :
obj_sess =
Session
() #
r�cup�rer
l'objet
indiqu�
par
le
cookie
om =
obj_sess.nom #
retrouver
la
valeur
d'un
attribut
existant
obj_sess.article =
49137
#
ajouter
un
nouvel
attribut
Les objets-sessions prennent aussi en charge une m�thode close(), qui a pour effet d'effacer
l'information de session. Vous n'�tes cependant pas oblig� de clore explicitement les sessions :
Karrigell s'assure de toute fa�on qu'il n'y ait jamais plus de 1000 sessions simultan�es : il efface les
plus anciennes quand on arrive � la 1000�me.
Exemple de mise en oeuvre :
Sauvegardez les trois petits scripts ci-dessous dans le r�pertoire-racine. Le premier g�n�re un
formulaire HTML similaire � ceux qui ont �t� d�crits plus haut. Nommez-le sessionTest1.py :
1
. #
Affichage
d'un
formulaire
d'inscription
:
2
.
3
. print
"""
4
.
<
H3
>
Veuillez
vous
identifier
,
SVP
:
<
/
H3
>
5
.
6
.
<
FORM
ACTION
=
"
sessionTest2
.
py
"
>
7
.
Votre
nom
:
<
INPUT
NAME
=
"
nomClient
"
>
<
BR
>
8
.
Votre
pr�nom
:
<
INPUT
NAME
=
"
prenomClient
"
>
<
BR
>
9
.
Votre
sexe
(
m
/
f
)
:
<
INPUT
NAME
=
"
sexeClient
"
SIZE
=
"
1
"
>
<
BR
>
10
.
<
INPUT
TYPE
=
"
submit
"
VALUE
=
"
OK
"
>
11
.
<
/
FORM
>
"""
Le suivant sera nomm� sessionTest2.py. C'est le script mentionn� dans la balise d'ouverture du formulaire ci-dessus � la ligne 6, et qui sera invoqu� lorsque l'utilisateur actionnera le bouton mis en place � la ligne 10. Ce script recevra les valeurs entr�es par l'utilisateur dans les diff�rents champs du formulaire, par l'interm�diaire d'un dictionnaire de requ�te situ� dans la variable d'environnement QUERY de Karrigell72 :
1
. obSess =
Session
()
2
.
3
. obSess.nom =
QUERY["
nomClient
"
]
4
. obSess.prenom =
QUERY["
prenomClient
"
]
5
. obSess.sexe =
QUERY["
sexeClient
"
]
6
.
7
. if
obSess.sexe.upper
() =
=
"
M
"
:
8
. vedette =
"
Monsieur
"
9
. else
:
10
. vedette =
"
Madame
"
11
.print
"
<
H3
>
Bienvenue
,
%s
%s
<
/
H3
>
"
%
(vedette, obSess.nom)
12
.print
"
<
HR
>
"
13
.print
"""
14
.
<
a
href
=
"
sessionTest3
.
py
"
>
Suite
.
.
.
<
/
a
>
"""
La premi�re ligne de ce script cr�e l'objet-session, g�n�re pour lui un identifiant unique, et
exp�die celui-ci au navigateur sous la forme d'un cookie.
Dans les lignes 3, 4, 5, on r�cup�re les valeurs entr�es dans les champs du formulaire pr�c�dent,
en utilisant leurs noms comme cl�s d'acc�s au dictionnaire de requ�tes.
La ligne 14 d�finit un lien http pointant vers le troisi�me script, nomm� sessionTest3.py :
1
. suiviSess =
Session
() #
retrouver
l'objet-session
2
. suiviSess.article =
12345
#
lui
ajouter
des
attributs
3
. suiviSess.prix =
43
.67
4
.
5
. print
"""
6
.
<
H3
>
Page
suivante
<
/
H3
>
<
HR
>
7
.
Suivi
de
la
commande
du
client
:
<
BR
>
%s
%s
<
BR
>
8
.
Article
n
�
%s
,
Prix
:
%s
<
HR
>
9
.
"""
%
(suiviSess.prenom, suiviSess.nom,
10
. suiviSess.article, suiviSess.prix)
Dirigez votre navigateur web vers l'adresse : http://localhost:8080/sessionTest1. Entrez des valeurs de votre choix dans les champs du formulaire, et cliquez sur le bouton OK :
![]() |
![]() |
Comme attendu, les informations entr�es dans le formulaire sont transmises � la deuxi�me page.
� pr�sent, si vous cliquez sur le lien : � Suite... � dans celle-ci, vous dirigez encore une fois votre
navigateur vers une nouvelle page, mais celle-ci n'aura fait l'objet d'aucune transmission de donn�es
(puisqu'on n'y acc�de pas par l'interm�diaire d'un formulaire). Dans le script sessionTest3.py qui
g�n�re cette page, vous ne pouvez donc pas utiliser la variable QUERY pour retrouver les
informations entr�es par le visiteur.
C'est ici qu'intervient le m�canisme des objets-sessions. Lors du lancement de ce troisi�me
script, le cookie m�moris� par le navigateur est relu par le serveur, ce qui lui permet de r�g�n�rer
l'objet-session cr�� dans le script pr�c�dent.

Analysez les trois premi�res lignes du script sessionTest3.py : l'objet suiviSess instanci� � partit
de la classe Session() est l'objet-session r�g�n�r�. Il contient les informations sauvegard�es � la
page pr�c�dente, et on peut lui en ajouter d'autres dans des attributs suppl�mentaires.
Vous aurez compris que vous pouvez d�sormais r�cup�rer toutes ces informations de la m�me
mani�re dans n'importe quelle autre page, car elles persisteront jusqu'� ce que l'utilisateur termine sa
visite du site, � moins que vous ne fermiez vous-m�me cette session par programme, � l'aide de la
m�thode close() �voqu�e plus haut.
Exercice :
17.2. Ajoutez au script pr�c�dent un lien vers une quatri�me page, et �crivez le script qui
g�n�rera celle-ci. Les informations devront cette fois �tre affich�es dans un tableau :
Nom | Pr�nom | Sexe | Article | Prix |
72 Karrigell met en place un certain nombre de variables globales dont les noms sont en majuscules pour �viter un conflit �ventuel avec les v�tres. Celle-ci joue le m�me r�le que la fonction FieldStorage() du module cgi. Veuillez consulter la documentation de Karrigell si vous souhaitez obtenir des explications plus d�taill�es.
17.3.5. Autres d�veloppements▲
Nous terminons ici cette br�ve �tude de Karrigell, car il nous semble vous avoir expliqu�
l'essentiel de ce qu'il vous faut conna�tre pour d�marrer. Si vous d�sirez en savoir davantage, il vous
suffira de consulter la documentation et les exemples fournis avec le produit. Comme nous l'avons
d�j� signal� plus haut, l'installation de Karrigell inclut l'installation du syst�me de bases de donn�es
Gadfly. Vous pouvez donc tr�s rapidement et tr�s ais�ment r�aliser un site interactif permettant la
consultation � distance d'un ensemble de donn�es quelconques, en admettant bien entendu que la
charge de requ�tes de votre site reste mod�r�e, et que la taille de la base de donn�es elle-m�me ne
devienne pas gigantesque. N'esp�rez pas g�rer � l'aide de Karrigell un site commercial susceptible
de traiter plusieurs millions de requ�tes journali�res !
Si vous ambitionnez de r�aliser ce genre de choses, il vous faudra �tudier d'autres offres
logicielles, comme par exemple CherryPy ou Zope associ�s � Apache pour le syst�me serveur, et
SQLite, MySQL ou PostgreSQL pour le gestionnaire de bases de donn�es.