« Programmation Python/Applications web » : différence entre les versions

Contenu supprimé Contenu ajouté
+ source
Ligne 115 :
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 :
 
<source lang="python" line>
{{todo|idem}}
#! /usr/bin/python
# Traitement des données transmises par un formulaire HTML
 
import cgi # Module d'interface avec le serveur web
<pre>
form = cgi.FieldStorage() # Réception de la requête utilisateur :
1.#! /usr/bin/python
# il s'agit d'une sorte de dictionnaire
2.# Traitement des données transmises par un formulaire HTML
if form.has_key("phrase"): # La clé n'existera pas si le champ
3.
text = form["phrase"].value # correspondant est resté vide
4.import cgi # Module d'interface avec le serveur web
else:
5.form = cgi.FieldStorage() # Réception de la requête utilisateur :
text ="*** le champ phrase était vide ! ***"
6. # il s'agit d'une sorte de dictionnaire
 
7.if form.has_key("phrase"): # La clé n'existera pas si le champ
if form.has_key("visiteur"): # La clé n'existera pas si le champ
8. text = form["phrase"].value # correspondant est resté vide
nomv = form["visiteur"].value # correspondant est resté vide
9.else:
else:
10. text ="*** le champ phrase était vide ! ***"
nomv ="mais vous ne m'avez pas indiqué votre nom"
11.
 
12.if form.has_key("visiteur"): # La clé n'existera pas si le champ
print "Content-Type: text/html\n"
13. nomv = form["visiteur"].value # correspondant est resté vide
print """
14.else:
<H3>Merci, %s !</H3>
15. nomv ="mais vous ne m'avez pas indiqué votre nom"
<H4>La phrase que vous m'avez fournie était : </H4>
16.
<H3><FONT Color="red"> %s </FONT></H3>""" % (nomv, text)
17.print "Content-Type: text/html\n"
 
18.print """
histogr ={}
19.<H3>Merci, %s !</H3>
for c in text:
20.<H4>La phrase que vous m'avez fournie était : </H4>
histogr[c] = histogr.get(c, 0) +1
21.<H3><FONT Color="red"> %s </FONT></H3>""" % (nomv, text)
 
22.
liste = histogr.items() # conversion en une liste de tuples
23.histogr ={}
liste.sort() # tri de la liste
24.for c in text:
print "<H4>Fréquence de chaque caractère dans la phrase :</H4>"
25. histogr[c] = histogr.get(c, 0) +1
for c, f in liste:
26.
print 'le caractère <B>"%s"</B> apparaît %s fois <BR>' % (c, f)
27.liste = histogr.items() # conversion en une liste de tuples
</source>
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)
</pre>
 
Les lignes 4 et 5 sont les plus importantes :
Ligne 213 ⟶ 211 :
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
<pre>
python Karrigell.py
</pre>
 
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''.
Ligne 235 ⟶ 231 :
Comme tous les autres éléments du site (fichiers ''.html'', ''.gif'', ''.jpeg'', etc.), ces scripts Python devront être placés dans le répertoire racine<ref>...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 sous-répertoires dans les adresses correspondantes.</ref>. Vous pouvez tout de suite effectuer un test élémentaire en rédigeant un petit script d'une seule ligne, tel que :
 
<source lang="python">
<pre>
print "Bienvenue sur mon site web !"
</presource>
 
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.
Ligne 243 ⟶ 239 :
É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 :
 
<source lang="python">
<pre>
print """
<TABLE BORDER="1" CELLPADDING="5">
Ligne 250 ⟶ 246 :
</TABLE>
"""
</presource>
 
Rappelons que la balise <code>TABLE</code> définit un tableau. Son option <code>BORDER</code> spécifie la largeur des bordures de séparation, et <code>CELLPADDING</code> l'écart à réserver autour du contenu des cellules. Les Balises <code>TR</code> et <code>TD</code> (''Table Row'' et ''Table Data'') définissent les lignes et les cellules du tableau.
Ligne 258 ⟶ 254 :
[[Image:Apprendre à programmer avec Python 65.png|center|tableau en html généré par un script python]]
 
<source lang="python" line>
{{todo|numéroter à droite}}
from math import sin, cos, tan, pi
 
# Construction de l'en-tête du tableau avec les titres de colonnes :
<pre>
print """<TABLE BORDER="1" CELLPADDING="5">
1.from math import sin, cos, tan, pi
<TR><TD>Angle</TD><TD>Sinus</TD><TD>Cosinus</TD><TD>Tangente</TD></TR>"""
2.
 
3.# Construction de l'en-tête du tableau avec les titres de colonnes :
for angle in range(0,62,10):
4.print """<TABLE BORDER="1" CELLPADDING="5">
# conversion des degrés en radians :
5.<TR><TD>Angle</TD><TD>Sinus</TD><TD>Cosinus</TD><TD>Tangente</TD></TR>"""
aRad = angle * pi / 180
6.
# construction d'une ligne de tableau, en exploitant le formatage des
7.for angle in range(0,62,10):
# chaînes de caractères pour fignoler l'affichage :
8. # conversion des degrés en radians :
print "<TR><TD>%s</TD><TD>%8.7f</TD><TD>%8.7f</TD><TD>%8.7g</TD></TR>"\
9. aRad = angle * pi / 180
% (angle, sin(aRad), cos(aRad), tan(aRad))
10. # construction d'une ligne de tableau, en exploitant le formatage des
11. # chaînes de caractères pour fignoler l'affichage :
print "</TABLE>"
12. print "<TR><TD>%s</TD><TD>%8.7f</TD><TD>%8.7f</TD><TD>%8.7g</TD></TR>"\
</source>
13. % (angle, sin(aRad), cos(aRad), tan(aRad))
14.
15.print "</TABLE>"
</pre>
 
;Commentaires
Ligne 306 ⟶ 300 :
Pour chaque page dans laquelle vous voulez consulter ou modifier une information de session, vous commencez par créer un objet de la classe <code>Session()</code> :
 
<source lang="python">
<pre>
objet_session = Session()
</presource>
 
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 :
 
<source lang="python">
<pre>
objet_session.nom = "Jean Dupont"
</presource>
 
Dans les autres pages, vous procédez de la même manière, mais l'objet produit dans ce cas par la classe <code>Session()</code> 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 :
 
<source lang="python">
<pre>
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
</presource>
 
Les objets-sessions prennent aussi en charge une méthode <code>close()</code>, 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.
Ligne 330 ⟶ 324 :
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'' :
 
<source lang="python" line>
<pre>
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>"""
</presource>
 
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 <code>QUERY</code> de Karrigell<ref>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 <code>FieldStorage()</code> du module ''cgi''. Veuillez consulter la documentation de Karrigell si vous souhaitez obtenir des explications plus détaillées.</ref> :
 
<source lang="python" line>
<pre>
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>"""
</presource>
 
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.
Ligne 369 ⟶ 363 :
La ligne 14 définit un lien http pointant vers le troisième script, nommé ''sessionTest3.py'' :
 
<source lang="python" line>
<pre>
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)
</presource>
 
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 :