IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Apprendre à programmer avec Python

Apprendre � programmer avec Python


pr�c�dentsommairesuivant

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) :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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.
Image non disponible
 
Sélectionnez

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 :

Image non disponible

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() :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

Image non disponible Image non disponible

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.

Image non disponible

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.


pr�c�dentsommairesuivant