En Perl, les choses sont un peu différentes. Le cgi Perl ne peut être qu'un programme qui génère des sorties.

Please download to get full document.

View again

of 53
318 views
PDF
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Document Description
Les CGI en Perl. En Perl, les choses sont un peu différentes. Le cgi Perl ne peut être qu'un programme qui génère des sorties. 1 Une fois de plus. #!/usr/bin/perl print Content-type: text/html\n\n ; print
Document Share
Documents Related
Document Transcript
Les CGI en Perl. En Perl, les choses sont un peu différentes. Le cgi Perl ne peut être qu'un programme qui génère des sorties. 1 Une fois de plus. #!/usr/bin/perl print Content-type: text/html\n\n ; print ' HTML '; print ' HEAD '; print ' TITLE Table /TITLE '; print ' /HEAD '; print ' BODY bgcolor = #CCCCCC '; print ' TABLE BORDER= 2 WIDTH=80% '; print ' TH COLSPAN=8 Titre de la table. /TH '; for($i=0;$i 4;$i++){ print ' TR '; for($j=0;$j =7;$j+=1){ print (' TD ALIGN=CENTER Bonjour. /TD '); } print (' /TR '); } print (' /TABLE '); print ' /BODY '; print ' /HTML '; 2 Commençons par un exemple. Considérons le programme suivant : #!/usr/bin/perl print fin; HTML HEAD TITLE essai de script CGI /TITLE /HEAD BODY Voici le texte de ma page /BODY /HTML fin Son exécution produit : HTML HEAD TITLE essai de script CGI /TITLE /HEAD BODY Voici le texte de ma page /BODY /HTML C'est à dire un source html. Le service cgi est un moyen de retransmettre ce résultat à un client html afin qu'il soit interprète et fournisse un résultat. 3 Les en têtes. Le serveur doit avoir des informations supplémentaires afin de savoir quoi faire de la sortie standard des scripts CGI. Cette information est fournie par l'en-tête MIME. Elle se présente immédiatement après la ligne shebang. #!/usr/bin/perl print Content-type: text/html\n\n ; print fin; HTML HEAD TITLE essai de script CGI /TITLE /HEAD Ce programme est stocké dans un répertoire cgi-bin, qui possède les droits d'accès appropriés, sous le nom premier.cgi . BODY Voici le texte de ma page /BODY /HTML fin 4 Appel du programme. On ouvre un navigateur et on se place dans la barre de navigation. Dans un navigateur et on fait référence à l'url qui contient le programme en question : 5 Les variables d'environnement d'un CGI. CONTENT_LENGTH : Taille des données en entrée. CONTENT_TYPE : Type MIME des entrée ( text/html ). GATEWAY_INTERFACE : Version CGI mise en œuvre par le serveur. HTTP_ACCEPT : Liste des types MIME reconnus par le client. HTTP_FROM : Adresse électronique de l'utilisateur. HTTP_USER_AGENT : Navigateur utilisé par le client. PATH_INFO : Spécification d'un chemin d'accès. PATH_TRANSLATED : Version décodée du contenu de PATH_INFO. HTTP_USER_AGENT : Navigateur utilisé par le client. QUERRY_STRING : Contenu de la requête. REMOTE_ADDR : Adresse IP de l'utilisateur. REMOTE_HOST : Nom de la machine de l'utilisateur. REMOTE_IDENT : Identification de lutilisateur. REMOTE_USER : Nom authentifié de l'utilisateur. REQUEST_METHOD : Méthode employée par l'utilisateur. SCRIPT_NAME : Chemin virtuel du script. SERVER_NAME : Nom ou adresse IP du serveur. SERVER_PORT : Numéro de port du client. SERVER_PROTOCOL : Nom et version du protocole. SERVER_SOFTWARE : Nom et version du serveur. 6 Formulaire. Les CGI sont très utilisé pour transmettre des informations d'un client WWW vers un service particulier, via un serveur HTTP. Synoptique des échanges client, serveur et script CGI par un formulaire. Le client WWW affiche un formulaire. L'utilisateur complète les champs et valide le contenu qui est transmis. L'information est transmise, méthode GET ou POST. Le serveur HTTP qui réceptionne la requête initialise le CGI référencé par le formulaire WWW ; Le CGI effectue le traitement demandé et retransmet le résultat vers le client WWW. 7 Référence à un cgi. Par l'intermédiaire d'un formulaire FORM Les informations sont envoyées au le serveur à une adresse spécifiée par son url. Cette adresse est spécifiée par l'attribut action. Le résultat généré par le serveur se présente dans la page courante ou dans la fenêtre du navigateur spécifiée par l'attribut target. La syntaxe est : FORM action= url method= get enctype= encodage name= nom target= cible FORM action= url method= post enctype= encodage name= nom target= cible 8 Les méthodes. Méthode GET : L'information est transmise dans l'url d'appel du script CGI qui les récupère via la variable QUERY_STRING. Méthode POST (fortement conseillée): Les champs sont transmis dans un corps de document dont le CONTENT_TYPE est application/x-www-form-urlencoded . Ils sont passés au script CGI via son entrée standard. Ce type implique que les champs du formulaire sont séparés par le caractère &, qu'ils sont précédés de leur nom, l'attribut NAME de la balise HTML $ $FORM$ $ et du signe =. Les caractères accentués et les espaces sont encodés comme spécifié dans RFC Notre toute première cgi. #!/usr/locałbin/perl # hello.cgi - My first CGI program print Content-Type: text/html\n\n ; Ne pas oublier les deux retours chariot. print html head \n ; print title c.g.i. qui dit bonjour! /title ; print /head \n ; print body \n ; print h1 salut christian... Comment tu vas? /h1 \n ; print /body /html \n ; 10 Explication. Le programme perl #!/usr/locałbin/perl # hello.cgi - My first CGI program print Content-Type: text/html\n\n ; Content-Type décrit le type d information MIME. print html head \n ; print title c.g.i. qui dit bonjour! /title ; print /head \n ; print body \n ; print h1 salut christian... Comment tu vas? /h1 \n ; print /body /html \n ; A généré la sortie suivante sur stdout Content-Type: text/html html head title c.g.i. qui dit bonjour! /title /head body h1 salut Christian... Comment tu vas? /h1 /body /html 11 Type de programmation. Il existe deux manières de programmer un CGI. La programmation orienté objet la plus complète. La programmation orienté fonction lorsqu'on n'a pas besoin des possibilités objet. En programmation orientée objet, il est nécessaire de créer un ou plusieurs objets CGI. Les méthodes qui leur sont associées seront alors utilisées pour créer les différents éléments de la page. Chaque objet CGI commence avec la liste des paramètres nommés tels qu'ils ont été passés au programme CGI par le serveur. En programmation orienté fonction, on utilise un objet CGI par défaut avec lequel on interagit que très rarement. On se contente d'appeler les fonctions pour toutes les opérations nécessaires : Récupérer les paramètres du CGI. Créer les balises HTML. Gérer les cookies. L'interface de programmation est propre mais limitée à un seul objet CGI à la fois 12 Orientation objet. # chargement du module CGI use CGI; # creation d'un nouvel objet CGI $q = new CGI; # creation de l'en-tete HTTP print $q- header, $q- start_html('orientation Objet.'), $q- h1('bonjour tout le monde.'), $q- end_html; 13 Orientation fonction # chargement des fonctions standard de CGI use CGI qw/:standard/; # creation de l'en-tete HTTP print header, start_html('orientation fonction.'), h1('bonjour tout le monde.'), end_html; 14 Par exemple. # Creation d'un formulaire et renvoie des valeurs. use CGI qw/:standard/; print header, start_html('un exemple simple'), h1('un exemple simple'), start_form, Votre nom? ,textfield('nom'),p, Vos gouts? , p, checkbox_group(-name= 'gouts', -values= ['television','cinema','lecture','eclectiques'], -defaults= ['eclectiques']), p, Votre statut? , popup_menu(-name= 'statut', -values= ['celibataire','marie','separe','divorce']),p, submit, end_form, hr; if (param()) { print Vous vous appelez ,em(param('nom')),p, Vos gouts sont : ,em(join( , ,param('gouts'))),p, Vous etes ,em(param('statut')), hr; } 15 Résultat. 16 Autre exemple. #!/usr/bin/perl use CGI qw/:standard/; my $page = new CGI; print header; print $page- start_html(-bgcolor= lightblue ); print h2('identite'), start_form, Votre nom... ,textfield('nom'),p, Votre prenom... ,textfield('prenom'),p, Votre mail... ,textfield('mail'),p, submit, end_form; print $page- hr; print $page- end_html; Et il est possible de mélanger les deux méthodes. if (param()) { print Votre prenom est ,strong(param('nom')),p, Votre nom est ,em(join( , ,param('prenom'))),p, Votre adresse mail est ,param('mail'), hr; } 17 Autre exemple. 18 Le problème des erreurs. De manière standard, les erreurs d'un cgi sont redirigées vers un fichier error_log . Nombre d'erreurs ne permettent pas de retrouver certaines informations indispensables. Le script fautif. La ligne en cause. L'heure du problème. Le type de l'erreur générée. Toute mise au point devient alors particulièrement délicate. Un module spécifique a été créé pour faciliter le travail, c'est CGI::Carp . Toute commande qui rajoute une ligne dans le fichier error_log sera prise en compte par le module. Chaque ligne indiquera très précisément : L'heure à laquelle s'est produit l'évènement. L'origine de l'erreur. Le fichier et ligne du fichier sur laquelle porte l'erreur. L'erreur sera quand même écrite dans le fichier log. 19 Utilisation de CGI::Carp. Pour valider le module Carp, on rajoute la ligne suivante au début du cgi. use CGI::Carp; De plus, si la commande se présente sous la forme : use CGI::Carp qw(fatalstobrowser); Les erreurs fatales apparaitront directement sur la page du navigateur mais seront tout de même écrite dans le fichier error_log. 20 Les types MIME. MIME signifie : Multipurpose Internet Mail Extensions. les types de base sont : Type MIME text/html text/plain text/rtf image/gif image/jpeg audiøbasic audiøx-wav videømpeg videøquicktime Description. Hyper Text Markup Language (HTML). Fichier texte ordinaire. Texte en format Rich Text Format. Image en format GIF. Image en format JPEG. Fichiers audio au format sun (*.au). Fichiers audio au format Windows (*.wav). Vidéo compressé en format MPEG. Vidéo en format Quick time. 21 L'interface navigateur - CGI. Le programme CGI reçoit un certain nombre d informations. En provenance du navigateur, du serveur et du programme lui même. Du navigateur : Son type. Ce qu il fait. etc... Du serveur : Son nom. La version. Le port sur lequel il s exécute. etc... Du programme : Son nom. Son emplacement. etc... En provenance de l utilisateur. Soit par une variable d environnement (méthode GET). Soit par l entrée standard stdin (méthode POST). 22 Les variables d'environnement. Variable REMOTE_ADR REMOTE_HOST HTTP_ACCEPT HTTP_USER_AGENT REQUEST_METHOD CONTENT_LENGTH QUERY_STRING PATH_INFO PATH_TRANSLATED Signification. L adresse IP de la machine client. Le nom de la machine client. Liste des types MIME que le navigateur est capable d interpréter. Information sur le navigateur (nom, numéro de version, système etc...). GET ou POST. La taille de l entrée si méthode POST, non utilisé si méthode GET. Information d entrée pour la méthode GET. Permet à l usager de spécifier un chemin (http://nom/cgibin/prog/path). Traduit le path relatif de PATH_INFO en path courant du système. 23 Les variables d'environnement. #!/usr/locałbin/perl print Content-type: text/html\n\n ; print html head \n ; print title les variables d environnement. /title \n ; print /head \n ; print body \n ; print h1 cgi Voici l ensemble des variables d environnement : /h1 \n ; foreach $variable (keys(%env)) { print B $variable /B = $ENV{$variable} BR \n ; } print /body /html \n ; 24 Liste des variables d'environnement. 25 Exemple de formulaire. html head title etat civil. /title /head body form action= /nometage.cgi method=post Quel est votre nom : input type=text name= nom p Quel est votre age : input type=text name= age p input type=submit /form /body /html 26 Et le CGI qui va avec. #!/usr/locałbin/perl # nameage.cgi use CGI; my $info = new CGI; $info devient la référence à un hash $info - header contient la chaine : Content-type: text/html \n\n $info - start_htm( Etat civil ) va mettre la chaine Etat civil dans les balises ; !DOCTYPE HTML PUBLIC -//IETF//DTD HTMŁ/EN HTML HEAD TITLE Etat civil /title $info - param( nom ) va permettre d accéder à la valeur d indice nom de la table de hash. print $info- header, $info- start_html( Etat civil ), Bonjour :, $info- param( nom ), BR , Vous avez bien, $info- param( age ), ans, n est-ce pas? br , $info- end_html; $info - end contient la chaine : /BODY /HTML $info - param( age ) va permettre d accéder à la valeur d indice age de la table de hash. 27 Exécution. 28 Résultat. 29 Autre exemple. Soit la page HTML suivante : HTML !-- Page crée par C. Aperghis-Tramoni -- HEAD TITLE test de CGI /TITLE /HEAD BODY BACKGROUND= ppats/backblue.jpg BGCOLOR= #FFFFFF TEXT= # LINK= #0000DD ALINK= #00DD00 VLINK= #DD0000 DIV H1 Appel de CGI. BR /H1 /DIV BR HR H3 BR Appel d un CGI date.cgi dont l URL est : BR BR BR A HREF= C.G.I. /A /H3 BR HR /BODY /HTML 30 Appel de CGI. Le texte html précédent produit le résultat suivant : 31 Contenu du programme date.cgi . #!/usr/locałbin/perl # date.cgi # Impression Header CGI. print Content-Type: text/html\n\n = ( Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi = ( Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Décembre ), ($ss,$mm,$hh,$jj,$mo,$aa,$js,$ja,$st) = localtime(time); $annee = $aa ; print html head \n ; print title la date et l heure. /title \n ; print /head \n ; print body BACKGROUND=\ ppats/nuages.jpg\ \n ; print h1 nous sommes le br ; print ( $jours[$js] $jj $mois[$mo] $annee br ); print ( Il est $hh heures, $mm minutes, $ss secondes br ); print ( Ce jour est le $ja ème de l année br ); print ( Nous sommes en heure d hiver. br ) if ($st =1); print /h1 ; print /body \n /html \n ; 32 Résultat obtenu. 33 Un formulaire client. HTML HEAD !-- Auteur : C.A.T. - Date = 19 Juin TITLE A Form /TITLE /HEAD BODY bgcolor= #80b080 P H3 ALIGN=CENTER Done for ERIICTA training. /h3 form action= http://naboo.lim.univ-mrs.fr/cgi-bin/chris/page.cgi method=post P Your first name.... INPUT TYPE=TEXT NAME=FIRST SIZE=40 /P P Your second name.. input TYPE=TEXT NAME=SECOND SIZE=40 /P P Your input TYPE=TEXT NAME=MAIL SIZE=40 /P BR CENTER INPUT TYPE=SUBMIT VALUE= Envoyer INPUT TYPE=RESET VALUE= Annuler /CENTER /FORM /BODY /HTML 34 Récupération de l'information.. C. Aperghis-Tramoni L'information envoyée par le client sera récupérée sur le serveur par un CGI. Récupération des valeurs par l'intermédiaire d'un hash. #!/usr/bin/perl use CGI; my $info = new CGI; #get info $nom1 = $info- param('first'); $nom2=$info- param('second'); $mail=$info- param('mail'); Your first name.... INPUT TYPE=TEXT NAME=FIRST SIZE=40 Your second name.. input TYPE=TEXT NAME=SECOND SIZE=40 Your input TYPE=TEXT NAME=MAIL SIZE=40 35 Edition des résultats. L'information est retournée au client en format html. print $info- header; print $info- start_html( result. ); print (' !DOCTYPE HTML PUBLIC -//IETF//DTD HTML//EN '); print (' HTML HEAD TITLE Your results. /title '); print (' /HEAD BODY bgcolor= #f5f5f5 '); print ( H1 CENTER This is the information you sent. : /CENTER /H1 BR ); print ( H3 Your first name is : $nom1. /h3 ) print ( H3 Your second name is : $nom2. /h3 ) print ( H3 Your is : $mail. /h3 ) print ( H2 Nice to meet you. /h2 ) print $cgi- end_html; print $cgi- end_html; 36 Les effets pervers de la mémoire cache. La majorité des navigateurs mémorisent les pages visitées dans un cache. Cette technique permet d'en disposer aussi longtemps que nécessaire sans avoir besoin de les recharger à chaque consultation. Cette technique est profitable sauf dans certains cas bien précis. Soit le cgi ci contre. #!/usr/bin/perl use CGI; my $cgi = new CGI; chomp ($heure = `date`); $script = $ENV{'SCRIPT_NAME'}; $rel = A HREF = \ $script \ Relancer. ; print $cgi- header; print $cgi- start_html( effet surprenant du cache. ); print (' !DOCTYPE HTML PUBLIC -//IETF//DTD HTML//EN '); print ( /HEAD BODY bgcolor='#f0f0ff' ); print ( H1 CENTER $heure BR ); print ( $rel. /center /h1 br ); print $cgi- end_html; 37 Résultat. Si le cache est actif, chaque requête faite par l'intermédiaire du lien Relancer ira chercher la page présente dans le cache et l'heure affichée ne sera pas remise à jour. Il est nécessaire d'interdire au navigateur de stocker le document dans sa mémoire cache. 38 Les intitulés Expires et Pragma Ce sont les intitulés Expires et Pragma qui vont permettre de contrôler la mise en cache d'une page. #!/usr/bin/perl use CGI; my $cgi = new CGI;.... print $cgi- header; print (' !DOCTYPE HTML PUBLIC -//IETF//DTD HTML//EN '); print ( /HEAD BODY bgcolor='#f0f0ff' ); # Suppression de la mise en cache. print ( Pragma: no cache \n\n );.... print $cgi- end_html; #!/usr/bin/perl use CGI; my $cgi = new CGI;.... print $cgi- header; print (' !DOCTYPE HTML PUBLIC -//IETF//DTD HTML//EN '); print ( /HEAD BODY bgcolor='#f0f0ff' ); # Date de peremption. print ( Expires: Tuesday 01-Jan-08 00:00:00 GMT\n\n );.... print $cgi- end_html; Attention, certains navigateurs se révèlent incapables de traiter de manière correcte ces en-têtes. 39 Utilisation de SSI. Server-Side Includes est un ensemble de fonctionnalités fournissant des instructions qui permettent d'insérer les résultats d'actions dans les documents html. L'utilisation de ces fonctions impose ique les documents aient l'extension shtml et que le fichier de configuration d'apache soit modifié comme suit. # # Pour activer SSI, utiliser les lignes suivantes: # # Pour les fichiers Server-parsed HTML : AddType text/html.shtml AddHandler server-parsed.shtmll Dans une page HTML, un commentaire est inséré par la ligne suivante. !-- description des instructions -- . Les instructions SSI s'insèrent dans un document *.shtml au moyen de la ligne. !--#include file= fichier.html -- La différence est le signe # qui va permettre d'utiliser le Server-parsed HTML a condition que le document ait l'extension shtml. !--#exec cgi= naboo.lidil.univ-mrs.fr/cgi-bin/chris/counter.pl -- 40 Les instructions SSI. !-# include file= fichier.html - !-# echo var= server_name - !-# echo var= last_modified - !-# exec cmd= /bin/uname -n - !-# exec cgi= /cgi-bin/form.pl- !-# fsize file= fichier.html - !-# config errmsg= erreur: fichier introuvable! - !-# config timefmt= %d/%m/%y - . Insère un fichier dans le document. Affiche le nom du navigateur. Affiche la date de dernière modification du fichier. Exécute la commande uname -n. Exécute le script form.pl. Affiche la taille du fichier en octets. Affiche ce message: ERREUR: fichier introuvable! Met en forme la date (et/ou l'heure). 41 Les fonctions de balisage. De nombreuses méthodes génèrent des balises HTML. Voyons comment les fonctions de balisage génèrent automatiquement certaines balises. use CGI qw/:standard/; $q = new CGI; print h1('en tete de niveau 1.'); print \n ; print $q - h1('en tete de niveau 1.'); h1 en tete de niveau 1. /h1 h1 en tete de niveau 1. /h1 42 La fonction header(). header() renvoie l'en-tête ``Content-type:''. On peut indiquer son propre type MIME, sinon il est positionné par défaut à text/html. Un second paramètre optionnel spécifie le code de Status et un message lisible. Les caractères de soulignement internes sont transformés en tiret. use CGI qw/:standard/; $q = new CGI; print header( -type= 'image/gif', -nph= 1, -status= 'en attente', -expires= '+3d', -cookie= $cookie, -charset= 'utf-7', -attachment= 'moi.jpg', -Cost= '$2.00'); print \n ; print $q- header( -type= 'image/gif', -nph= 1, -status= 'en attente', -expires= '+3d', -cookie= $cookie, -charset= 'utf-7', -attachment= 'moi.jpg', -Cost= '$2.00'); HTTP/1.0 En attente Server: cmdline Status: En attente Expires: Sun, 24 Feb :21:24 GMT Date: Thu, 21 Feb :21:24 GMT Content-Disposition: attachment; filename= moi.jpg Cost: $2.00 Content-Type: image/gif; charset=utf-7 HTTP/1.0 En attente Server: cmdline Status: En attente Expires: Sun, 24 Feb :21:24 GMT Date: Thu, 21 Feb :21:24 GMT Content-Disposition: attachment; filename= moi.jpg
Similar documents
View more...
Search Related
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks
SAVE OUR EARTH

We need your sign to support Project to invent "SMART AND CONTROLLABLE REFLECTIVE BALLOONS" to cover the Sun and Save Our Earth.

More details...

Sign Now!

We are very appreciated for your Prompt Action!

x