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

Apprendre à programmer avec Python

Apprendre programmer avec Python


prcdentsommairesuivant

Chapitre 17 : Applications web

Vous avez certainement dj appris par ailleurs un grand nombre de choses concernant la rdaction de pages web. Vous savez que ces pages sont des documents au format HTML, que l'on peut consulter via un rseau (intranet ou internet) l'aide d'un logiciel appel browser web ou navigateur (Netscape, Konqueror, Internet explorer, ...).

Les pages HTML sont installes dans les rpertoires 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 vtre, votre logiciel navigateur peut dialoguer avec le logiciel serveur (par l'intermdiaire de toute une srie de dispositifs matriels et logiciels dont nous ne traiterons pas ici : lignes tlphoniques, routeurs, caches, protocoles de communication ...).

Le protocole HTTP qui gre la transmission des pages web autorise l'change de donnes 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 expdis en grand nombre (ce sont les pages consultes) ; en revanche, le navigateur n'envoie gure au serveur que de toutes petites quantits d'information : essentiellement les adresses URL des pages que l'internaute dsire consulter.

17.1. Pages web interactives

Vous savez cependant qu'il existe des sites web o vous tes invit fournir vous-mme des quantits d'information plus importantes : vos rfrences personnelles pour l'inscription un club ou la rservation d'une chambre d'htel, votre numro de carte de crdit 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 ct du serveur, par un programme spcifique. Il faut donc que les pages web destines accueillir cette information soient dotes d'un mcanisme assurant son transfert vers le logiciel destin la traiter. Il faudra galement que ce logiciel puisse lui-mme transmettre en retour une information au serveur, afin que celui-ci puisse prsenter le rsultat de l'opration l'internaute, sous la forme d'une nouvelle page web.

Le but du prsent chapitre est de vous expliquer comment vous pouvez vous servir de vos comptences de programmeur Python pour ajouter une telle interactivit un site web, en y intgrant de vritables 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 manire approprie). En ce qui concerne l'internet, par contre, les choses sont un peu plus compliques. 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 propritaire. Si un fournisseur d'accs 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'accs. Il faudra en particulier lui demander si vous pouvez activer des scripts CGI crits en Python partir de vos pages, et dans quel(s) rpertoire(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 mme ordinateur. Avec CGI, vous pouvez crire des scripts dans diffrents langages (Perl, C, Tcl, Python ...).

Plutt que de limiter le web des documents crits l'avance, CGI permet de gnrer des pages web sur le champ, en fonction des donnes que fournit l'internaute par l'intermdiaire de son logiciel de navigation. Vous pouvez utiliser les scripts CGI pour crer une large palette d'applications : des services d'inscription en ligne, des outils de recherche dans des bases de donnes, 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 prsentent les modules serveurs d'applications spcialiss tels que Karrigell, CherryPy ou Zope, pour le programmeur dsireux de dvelopper un site web interacif.

17.2.1. Une interaction CGI rudimentaire

Pour la bonne comprhension de ce qui suit, nous supposerons que l'administrateur rseau de votre tablissement scolaire ou de votre entreprise a configur un serveur web d'intranet d'une manire telle que vous puissiez installer des pages HTML et des scripts Python dans un rpertoire personnel.

Notre premier exemple sera constitu d'une page web extrmement simple. Nous n'y placerons qu'un seul lment d'interactivit, savoir un unique bouton. Ce bouton servira lancer l'excution d'un petit programme que nous dcrirons par aprs.

Veuillez donc encoder le document HTML ci-dessous l'aide d'un diteur quelconque (n'encodez pas les numros 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 associe  un script Python</P>
9.
10.<FORM ACTION="http://Serveur/cgi-bin/input_query.py" METHOD="post">
11.<INPUT TYPE="submit" NAME="send" VALUE="Excuter le script">
12.</FORM>
13.
14.</DIV></BODY></HTML>

Vous savez certainement dj que les balises initiales <HTML>, <HEAD>, <TITLE>, <BODY>, ainsi que les balises finales correspondantes, sont communes tous les documents HTML. Nous ne dtaillerons donc pas leur rle ici.

La balise <DIV> utilise la ligne 5 sert habituellement diviser un document HTML en sections distinctes. Nous l'utilisons ici pour dfinir une section dans laquelle tous les lments seront centrs (horizontalement) sur la page.

A la ligne 6, nous insrons une petite image.

La ligne 7 dfinit 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> dfinissent 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'entre, boutons, cases cocher, boutons radio, etc.

La balise FORM doit contenir deux indications essentielles : l'action accomplir lorsque le formulaire sera expdi (il s'agit en fait de fournir ici l'adresse URL du logiciel invoquer pour traiter les donnes transmises), et la mthode utiliser pour transmettre l'information (en ce qui nous concerne, ce sera toujours la mthode post ).

Dans notre exemple, le logiciel que nous voulons invoquer est un script Python nomm input_query.py qui est situ dans un rpertoire particulier du serveur d'intranet. Sur de nombreux serveurs, ce rpertoire 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 mme rpertoire que celui o vous placez vos pages Web personnelles.

Vous devrez donc modifier la ligne 10 de notre exemple, en remplaant l'adresse http://Serveur/cgi-bin/input_query.py par ce que votre professeur vous indiquera68.

La ligne 11 contient la balise qui dfinit un widget de type bouton d'envoi (balise <INPUT TYPE="submit">). Le texte qui doit apparatre sur le bouton est prcis par l'attribut VALUE ="texte". L'indication NAME est facultative dans le cas prsent. Elle mentionne le nom du widget lui-mme (au cas o le logiciel destinataire en aurait besoin).

Lorsque vous aurez termin l'encodage de ce document, sauvegardez-le dans le rpertoire que l'on vous a attribu spcifiquement pour y placer vos pages, sous un nom quelconque, mais de prfrence avec l'extension .html ou .htm (par exemple : essai.html).


Le script Python input_query.py est dtaill ci-dessous. Comme dj signal plus haut, vous pouvez installer ce script dans le mme rpertoire 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 prcdent.

La premire ligne est absolument ncessaire : elle indique l'interface CGI qu'il faut lancer l'interprteur Python pour pouvoir excuter le script. La seconde ligne est un simple commentaire.

La ligne 4 est indispensable. Elle permet l'interprteur Python d'initialiser un vritable document HTML qui sera transmis au serveur web. Celui-ci pourra son tour le rexpdier au logiciel navigateur de l'internaute, et celui-ci le verra donc s'afficher dans la fentre de navigation.

La suite est du pur code HTML, trait par Python comme une simple chane de caractres que l'on affiche l'aide de l'instruction print. Pour pouvoir y insrer tout ce que nous voulons, y compris les sauts la ligne, les apostrophes, les guillemets, etc., nous dlimitons cette chane de caractres l'aide de triples guillemets (Rappelons galement ici que les sauts la ligne sont compltement ignors en HTML : nous pouvons donc en utiliser autant que nous voulons pour arer 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 donnes

Analysons prsent le code HTML lui-mme. Nous y trouvons essentiellement un nouveau formulaire, qui comporte plusieurs paragraphes, parmi lesquels on peut reconnatre quelques widgets. La ligne 10 indique le nom du script CGI auquel les donnes du formulaire seront transmises : il s'agira bien videmment d'un autre script Python.

A la ligne 12, on trouve la dfinition d'un widget de type champ d'entre (Balise INPUT, avec TYPE="text"). L'utilisateur est invit y encoder son nom. Le paramtre MAXLENGTH dfinit une longueur maximale pour la chane de caractres qui sera entre ici (20 caractres, en l'occurrence). Le paramtre SIZE dfinit la taille du champ tel qu'il doit apparatre l'cran, et le paramtre NAME est le nom que nous choisissons pour la variable destine mmoriser la chane de caractres attendue.

Un second champ d'entre un peu diffrent est dfini la ligne 14 (balise TEXTAREA). Il s'agit d'un rceptacle plus vaste, destin accueillir des textes de plusieurs lignes. (Ce champ est automatiquement pourvu d'ascenseurs si le texte insrer se rvle trop volumineux). Ses paramtres ROWS et COLS sont assez explicites. Entre les balises initiale et finale, on peut insrer un texte par dfaut ( Mississippi dans notre exemple).

Comme dans l'exemple prcdent, la ligne 16 contient la dfinition du bouton qu'il faudra actionner pour transmettre les donnes au script CGI destinataire, lequel est dcrit ci-aprs.

17.2.3. Un script CGI pour le traitement des donnes

Le mcanisme utilis l'intrieur d'un script CGI pour rceptionner les donnes 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 donnes transmises par un formulaire HTML
3.
4. import cgi                        # Module d'interface avec le serveur web
5. form = cgi.FieldStorage()         # Rception de la requte 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>Frquence de chaque caractre dans la phrase :</H4>"
30.for c, f in liste:
31.   print 'le caractre <B>"%s"</B> apparat %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 donnes transmises par le formulaire HTML. Nous plaons cet objet, lequel est assez semblable un dictionnaire classique, dans la variable form.

Par rapport un vritable dictionnaire, l'objet plac dans form prsente la diffrence essentielle qu'il faudra lui appliquer la mthode value() pour en extraire les donnes. Les autres mthodes applicables aux dictionnaires, telles la mthode has_key() , par exemple, peuvent tre utilises de la manire habituelle.

Une caractristique importante de l'objet dictionnaire retourn par FieldStorage() est qu'il ne possdera aucune cl pour les champs laisss vides dans le formulaire HTML correspondant.

Dans notre exemple, le formulaire comporte deux champs d'entre, auxquels nous avons associ les noms visiteur et phrase . Si ces champs ont effectivement t complts 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 complt, l'index correspondant n'existera tout simplement pas. Avant toute forme de traitement de valeurs, il est donc indispensable de s'assurer de la prsence de chacun des index attendus, et c'est ce que nous faisons aux lignes 7 15.


(17) Exercice :

17.1. Pour vrifier ce qui prcde, vous pouvez par exemple dsactiver (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 complte effectivement les champs qui lui sont proposs. Si l'un des champs est laiss vide, par contre, une erreur se produit.

Note importante : le script tant lanc par l'intermdiaire d'une page web, les messages d'erreur de Python ne seront pas affichs dans cette page, mais plutt enregistrs dans le journal des vnements du serveur web. Veuillez consulter l'administrateur de ce serveur pour savoir comment vous pouvez accder ce journal. De toute manire, 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 donnes transmises par le formulaire. Veuillez noter que les variables nomv et text doivent exister au pralable, 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 rsultant en une liste de tuples, pour pouvoir trier celle-ci dans l'ordre alphabtique 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 prcdentes, nous vous avons expliqu quelques rudiments de programmation CGI afin que vous puissiez mieux comprendre comment fonctionne une application web. Mais si vous voulez vritablement dvelopper 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 rvle fort lourde, et il est donc prfrable de faire appel des outils plus labors.

L'intrt pour le dveloppement web est devenu trs important, et il existe donc une forte demande pour des interfaces et des environnements de programmation bien adapts cette tche. Or, mme s'il ne peut pas prtendre l'universalit de langages tels que C/C++, Python est dj largement utilis un peu partout dans le monde pour crire des programmes trs ambitieux, y compris dans le domaine des serveurs d'applications web. La robustesse et la facilit de mise en oeuvre du langage ont sduit de nombreux dveloppeurs de talent, qui ont ralis des outils de dveloppement web de trs haut niveau. Plusieurs de ces applications peuvent vous intresser si vous souhaitez raliser vous-mme des sites web interactifs de diffrents 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 rpondre des milliers de requtes journalires, et dont les diffrents secteurs sont grs sans interfrence par des personnes de comptences varies (infographistes, programmeurs, spcialistes de bases de donnes, etc.).

Le plus clbre de ces produits est le logiciel Zope, dj adopt par de grands organismes privs et publics pour le dveloppement d'intranets et d'extranets collaboratifs. Il s'agit en fait d'un systme serveur d'applications, trs performant, scuris, presqu'entirement crit en Python, et que l'on peut administrer distance l'aide d'une simple interface web. Il ne nous est pas possible de dcrire 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 grer de trs 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 intressants sont disponibles. Tout comme Zope, la plupart d'entre eux peuvent tre tlchargs 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 prfrable si le site raliser est destin supporter une charge de connexions trs importante), mais certains d'entre eux intgrent en outre leur propre serveur web, ce qui leur permet de fonctionner galement de manire tout fait autonome. Cette possibilit se rvle particulirement intressante au cours de la mise au point d'un site, car elle facilite la recherche des erreurs.

Cette totale autonomie allie la grande facilit de leur mise en oeuvre fait de ces produits de fort bonnes solutions pour la ralisation de sites web d'intranet spcialiss, notamment dans des petites et moyennes entreprises, des administrations, ou dans des coles. Si vous souhaitez dvelopper une application Python qui soit accessible par l'intermdiaire d'un simple navigateur web, via un intranet d'entreprise (ou mme via l'internet, si la charge prvisible n'est pas trop importante), ces applications sont faites pour vous.

Il en existe une grande varit : 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 dcrire une petite application web fonctionnant l'aide de Karrigell. Vous pouvez trouver ce systme l'adresse : http://karrigell.sourceforge.net. Il s'agit d'une solution de dveloppement web simple, bien documente en anglais et en franais (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 rpertoire quelconque le fichier archive que vous aurez tlcharg depuis l'internet. L'opration de dsarchivage cre automatiquement un sous-rpertoire nomm Karrigell-numro de version. C'est ce rpertoire que nous considrerons comme rpertoire racine dans les lignes qui suivent.

Si vous ne comptez pas utiliser le serveur de bases de donnes Gadfly69 qui vous est fourni en complment de Karrigell lui-mme, c'est tout ! Sinon, entrez dans le sous-rpertoire gadfly-1.0.0 et lancez la commande : python setup.py install (Sous Linux, il faut tre root). Vous devez effectuer cette opration si vous souhaitez visualiser la totalit de la dmonstration intgre.

69 Voyez le chapitre prcdent : Gadfly est un serveur de bases de donnes crit en Python.

17.3.2. Dmarrage du serveur :

Il s'agit donc bel et bien de mettre en route un serveur web, auquel vous pourrez accder ensuite l'aide d'un navigateur quelconque, localement ou par l'intermdiaire d'un rseau. Avant de le faire dmarrer, 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 rpertoire-racine.

Par dfaut, Karrigell attend les requtes http sur le port n 80. Et c'est bien ce numro de port que la plupart des logiciels navigateurs utilisent eux-mmes par dfaut. 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 numros de port infrieurs 1024 (pour des raisons de scurit). Si vous tes dans ce cas, vous devez donc modifier le fichier de configuration afin que Karrigell utilise un numro de port plus lev. En gnral, vous choisirez d'enlever simplement le caractre # au dbut 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 rpertoire racine pour votre site web (par dfaut, c'est le rpertoire du serveur lui-mme).

Une fois le fichier de configuration modifi, entrez dans le rpertoire racine du serveur, si vous n'y tes pas dj, et lancez simplement la commande :

python Karrigell.py

C'est tout. Votre serveur Karrigell se met en route, et vous pouvez en vrifier le fonctionnement tout de suite l'aide de votre navigateur web prfr. Si vous lancez celui-ci sur la mme machine que le serveur, vous le dirigerez vers une adresse telle que : http://localhost:8080/index.html, localhost tant le terme consacr pour dsigner la machine locale, 8080 le numro 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 accder cette mme 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 indique au paragraphe prcdent70, vous atteindrez la page d'accueil d'un site de dmonstration de Karrigell, qui est dj pr-install dans le rpertoire racine. Vous y retrouverez la documentation de base, ainsi que toute une srie d'exemples.

Dans ce qui prcde, il est sous-entendu que vous avez lanc le serveur depuis une console texte, ou depuis une fentre de terminal. Dans un cas comme dans l'autre, les messages de contrle mis par le serveur apparatront dans cette console ou cette fentre. C'est l que vous pourrez rechercher des messages d'erreur ventuels. C'est l aussi que vous devrez intervenir si vous voulez arrter le serveur (avec la combinaison de touches CTRL-C).

70 Si vous avez laiss en place le n de port par dfaut (80), il est inutile de le rappeler dans les adresses, puisque c'est ce n de port qui est utilis par dfaut par la plupart des navigateurs. Une autre convention consiste considrer 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 commenant par sa page d'accueil, on peut donc en gnral omettre ce nom dans l'adresse. Karrigell respecte cette convention, et vous pouvez donc vous connecter en utilisant une adresse simplifie telle que : http://localhost:8080 ou mme : http://localhost (si le n de port est 80).

17.3.3. bauche de site web

Essayons prsent de raliser notre propre bauche de site web. la diffrence d'un serveur web classique, Karrigell peut grer 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 ct les scripts hybrides, dont vous pourrez tudier vous-mme la syntaxe (par ailleurs trs simple) si vous vous lancez dans une ralisation d'une certaine importance (ils pourront vous faciliter la vie). Dans le contexte limit de ces pages, nous nous contenterons de quelques expriences de base avec des scripts Python ordinaires.

Comme tous les autres lments du site (fichiers .html, .gif, .jpeg, etc.), ces scripts Python devront tre placs dans le rpertoire racine71. Vous pouvez tout de suite effectuer un test lmentaire en rdigeant 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 rpertoire racine, puis entrez l'adresse : http://localhost/hello.py (ou mme : http://localhost/hello - l'extension .py peut tre omise) dans votre navigateur. Vous devriez y voir apparatre le message. Cela signifie donc que dans l'environnement Karrigell, la sortie de l'instruction print est redirige vers la fentre du navigateur client, plutt que la console (ou la fentre de terminal) du serveur.

tant donn que l'affichage a lieu dans une fentre de navigateur web, vous pouvez utiliser toutes les ressources de la syntaxe HTML afin d'obtenir un formatage dtermin. 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 dfinit un tableau. Son option BORDER spcifie la largeur des bordures de sparation, et CELLPADDING l'cart rserver autour du contenu des cellules. Les Balises TR et TD (Table Row et Table Data) dfinissent 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 dfinir la gamme d'angles couvrir (de zro 60 degrs par pas de 10).

Ligne 9 : Les fonctions trigonomtriques de Python ncessitent que les angles soient exprims 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 systme de formatage des chanes de caractres dcrit dj la page 130 : le marqueur de conversion %8.7f force un affichage 8 chiffres, dont 7 aprs la virgule dcimale. Le marqueur %8.7g fait peu prs la mme chose, mais passe la notation scientifique lorsque c'est ncessaire.
Image non disponible
 
Sélectionnez

1. from math import sin, cos, tan, pi
2.
3. # Construction de l'en-tte 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 degrs en radians :
9.     aRad = angle * pi / 180
10.    # construction d'une ligne de tableau, en exploitant le formatage des
11.    # chanes de caractres 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 diffrence entre ce que nous venons d'exprimenter ici et un script CGI classique (tels ceux des pages 266 et suivantes).

L'intrt de travailler dans un environnement plus spcifique tel que Karrigell apparat cependant trs vite si vous faites des erreurs. En programmation CGI classique, les messages d'erreur mis par l'interprteur Python ne s'affichent pas dans la fentre du navigateur. Ils sont enregistrs 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 trs efficace, ainsi que d'un outil de dboguage complet. Faites l'exprience d'introduire une petite erreur dans le script ci-dessus, et relancez votre navigateur sur la page modifie. Par exemple, en supprimant le double point la fin de la ligne 7, nous avons obtenu nous-mmes l'affichage suivant :

Image non disponible

En cliquant sur le bouton Debug , on obtient encore une foule d'informations complmentaires (affichage du script complet, variables d'environnement, etc.).

71 ...ou bien dans des sous-rpertoires du rpertoire 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 sousrpertoires dans les adresses correspondantes.

17.3.4. Prise en charge des sessions

Lorsque l'on labore un site web interactif, on souhaite frquemment que la personne visitant le site puisse s'identifier et fournir un certain nombre de renseignements tout au long de sa visite dans diffrentes pages (l'exemple type tant le remplissage d'un caddy au cours de la consultation d'un site commercial), toutes ces informations tant conserves quelque part jusqu' la fin de sa visite. Et il faut bien entendu raliser cela indpendamment pour chaque client connect.

Il serait possible de transmettre les informations de page en page l'aide de champs de formulaires cachs, mais ce serait compliqu et trs contraignant. Il est prfrable que le systme serveur soit dot d'un mcanisme spcifique, qui attribue chaque client une session particulire. Karrigell ralise cet objectif par l'intermdiaire de cookies. Lorsqu'un nouveau visiteur du site s'identifie, le serveur gnre 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 mmorise 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 crer un objet de la classe Session() :

 
Sélectionnez

objet_session = Session()

Si vous tes au dbut de la session, Karrigell gnre 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 procdez de la mme manire, mais l'objet produit dans ce cas par la classe Session() n'est pas nouveau : c'est l'objet cr en dbut de session, retrouv en interne par le serveur grce son identifiant relu dans le cookie. Vous pouvez accder aux valeurs de ses attributs, et aussi en ajouter de nouveaux :

 
Sélectionnez

obj_sess = Session()               # rcuprer 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 mthode 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 faon qu'il n'y ait jamais plus de 1000 sessions simultanes : il efface les plus anciennes quand on arrive la 1000me.


Exemple de mise en oeuvre :

Sauvegardez les trois petits scripts ci-dessous dans le rpertoire-racine. Le premier gnre un formulaire HTML similaire ceux qui ont t dcrits 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 prnom : <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 entres par l'utilisateur dans les diffrents champs du formulaire, par l'intermdiaire d'un dictionnaire de requte 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 premire ligne de ce script cre l'objet-session, gnre pour lui un identifiant unique, et expdie celui-ci au navigateur sous la forme d'un cookie.

Dans les lignes 3, 4, 5, on rcupre les valeurs entres dans les champs du formulaire prcdent, en utilisant leurs noms comme cls d'accs au dictionnaire de requtes.

La ligne 14 dfinit un lien http pointant vers le troisime 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 entres dans le formulaire sont transmises la deuxime page. prsent, 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 donnes (puisqu'on n'y accde pas par l'intermdiaire d'un formulaire). Dans le script sessionTest3.py qui gnre cette page, vous ne pouvez donc pas utiliser la variable QUERY pour retrouver les informations entres par le visiteur.

C'est ici qu'intervient le mcanisme des objets-sessions. Lors du lancement de ce troisime script, le cookie mmoris par le navigateur est relu par le serveur, ce qui lui permet de rgnrer l'objet-session cr dans le script prcdent.

Image non disponible

Analysez les trois premires lignes du script sessionTest3.py : l'objet suiviSess instanci partit de la classe Session() est l'objet-session rgnr. Il contient les informations sauvegardes la page prcdente, et on peut lui en ajouter d'autres dans des attributs supplmentaires.

Vous aurez compris que vous pouvez dsormais rcuprer toutes ces informations de la mme manire 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-mme cette session par programme, l'aide de la mthode close() voque plus haut.

Exercice :

17.2. Ajoutez au script prcdent un lien vers une quatrime page, et crivez le script qui gnrera celle-ci. Les informations devront cette fois tre affiches dans un tableau :

Nom Prnom 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 vtres. Celle-ci joue le mme rle que la fonction FieldStorage() du module cgi. Veuillez consulter la documentation de Karrigell si vous souhaitez obtenir des explications plus dtailles.

17.3.5. Autres dveloppements

Nous terminons ici cette brve tude de Karrigell, car il nous semble vous avoir expliqu l'essentiel de ce qu'il vous faut connatre pour dmarrer. Si vous dsirez en savoir davantage, il vous suffira de consulter la documentation et les exemples fournis avec le produit. Comme nous l'avons dj signal plus haut, l'installation de Karrigell inclut l'installation du systme de bases de donnes Gadfly. Vous pouvez donc trs rapidement et trs aisment raliser un site interactif permettant la consultation distance d'un ensemble de donnes quelconques, en admettant bien entendu que la charge de requtes de votre site reste modre, et que la taille de la base de donnes elle-mme ne devienne pas gigantesque. N'esprez pas grer l'aide de Karrigell un site commercial susceptible de traiter plusieurs millions de requtes journalires !

Si vous ambitionnez de raliser ce genre de choses, il vous faudra tudier d'autres offres logicielles, comme par exemple CherryPy ou Zope associs Apache pour le systme serveur, et SQLite, MySQL ou PostgreSQL pour le gestionnaire de bases de donnes.


prcdentsommairesuivant

Licence Creative Commons
Le contenu de cet article est rédigé par Gérard Swinnen et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.