Ceci est une ancienne révision du document !
Cours d'Introduction aux Web et Services Web
Cet ensemble de cours se déroule dans le prolongement de cours sur les protocoles UDP et TCP over IP. Il s'appuie donc sur la programmation Socket pour les développements en TP telle que présentée dans le support de cours Sockets de Dino Lopez.
Cours d'introduction : du Web au Web services
Travaux pratiques : Mon premier serveur web dans mon serveur TCP/IP Socket
Quelques Notes et Commentaires :
- Une des difficultés de ce TD réside dans le respect du format d'échange entre le client (browser Web) et votre serveur Web. Ce format est décrit dans le protocole HTTP.Les détails sont donnés dans les transparents du cours ci-dessus.
- La lecture d'une variable d'environnement avec python se fait grâce à : os.environ[“VAR_NAME”]
Quelques compléments pour le TD
Rappel sur la programmation réseau avec les sockets et python
Exemple de Code Python d'un client et d'un serveur TCP/IP (Python 2) code_client_server_socket_python.zip, attention donc à la version Python que vous utilisé Différences entres python 2 et python 3
RENDU TD1
- les fichiers python (ex. serveurweb.py) et tous les fichiers et répertoires nécessaires à la bonne exécution de votre solution (ex. la sous arborescence des fichiers et répertoires exportés par votre serveur) doivent être regroupés dans un fichier <votre_nom>.zip, où <votre_nom> est votre nom (sans le prénom) tout en minuscules.
- Un fichier README.txt doit être rédigé pour donner un minimum d'explications sur votre solution comme la commande d'appel de votre programme et ses arguments, l'url à définir dans votre browser web pour tester votre serveur et les résultats attendus dans le browser.
- Le fichier .zip et le fichier README.txt doivent être attaché à un email à l'attention de tigli@unice.fr
- Votre email à l'attention de tigli@unice.fr doit comporter le sujet suivant : [TD SERVEUR WEB SI3] [<votre_nom>], où <votre_nom> est votre nom (sans le prénom) tout en minuscules.
- La date limite de rendu est le Dimanche 26/03/17 à minuit . Toute heure de retard sera pénalisée par un point de moins sur la note du TD.
- Tout rendu qui ne respectera pas l'intégralité des consignes ci-dessus ne sera pas pris en compte car intraitable et potentiellement perdu lors de la collecte et le rangement automatique de mails.
Cours sur le Web Dynamique et le protocole HTTP
Travaux pratiques : Serveur de pages Web Dynamiques
Cours d'introduction aux Services Web
Travaux pratiques : Introduction aux Web Services
RENDU TD3
Pour illustrer le fonctionnement de votre serveur vous devrez écrire trois cgi-bin :
- Un premier cgi-bin type GET qui renverra une chaine de caractère reçue précédée de la chaine “GET”
- Un second cgi-bin type POST qui renverra une chaine de caractère reçue précédée de la chaine “POST”
- Un premier cgi-bin type POST/GET qui renverra une chaine de caractère reçue précédée de la chaine “GET de POST/GET” s'il répond à une commande GET et “POST de POST/GET” s'il répond à une commande POST
Pour tester les 4 cas d'appels des cgi-bin, 4 formulaires seront écrits avec des noms explicites test-post.get, test-post.html, test-post-get-post.html, test-get-get-post.html.
Ces 4 formulaires seront accessible directement comme fichiers .html à la racine $HTTP_ROOT de votre serveur.
- les fichiers python (ex. serveurweb.py) et tous les fichiers et répertoires nécessaires à la bonne exécution de votre solution (ex. la sous arborescence des fichiers et répertoires exportés par votre serveur) doivent être regroupés dans un fichier <votre_nom>.zip, où <votre_nom> est votre nom (sans le prénom) tout en minuscules.
- Un fichier README.txt doit être rédigé pour donner un minimum d'explications sur votre solution comme les 4 url à tester dans un browser web.
- Le fichier .zip et le fichier README.txt doivent être attaché à un email à l'attention de tigli@unice.fr
- Votre email à l'attention de tigli@unice.fr doit comporter le sujet suivant : [TD SERVEUR WEB avec POST cgi-bin SI3] [<votre_nom>], où <votre_nom> est votre nom (sans le prénom) tout en minuscules.
- La date limite de rendu est le Dimanche 16/04/17 à minuit . Toute heure de retard sera pénalisée par un point de moins sur la note du TD.
- Tout rendu qui ne respectera pas l'intégralité des consignes ci-dessus ne sera pas pris en compte car intraitable et potentiellement perdu lors de la collecte et le rangement automatique de mails.
Frequently Asked Quastions: FAQ
Comment écrire un chemin de fichier indépendant de l'OS ?
on dispose également de la fonction os.path.join( chemin1, chemin2) qui permet de concaténer des chemins simplement en respectant les convention de l'OS de support :
chemin=os.getenv('HOME') chemin=os.path.join(chemin,'Bureau') print (chemin) /home/user/Bureau
Comment utiliser les pipes en python ?
- Le module os (import os) en python vous permet d'avoir accès à une API proche de POSIX dans laquelle vous trouvez :
os.fork() pipein, pipeout = os.pipe() ... = os.read(pipein, ...) os.write(pipeout, ...) os.close(pipein) os.close(pipeout)
myPopen = subprocess.Popen(['cat', '-n']) : fait l'appel système non bloquant. si on veut pouvoir envoyer des données sur le stdin du process, il faut faire : myPopen = subprocess.Popen(['cat', '-n'], stdin = subprocess.PIPE). si on veut pouvoir récupérer des données de la sortie standard et de la sortie d'erreur du process, il faut faire : <code> myPopen = subprocess.Popen(['cat', '-n'], stdout = subprocess.PIPE, stderr = subprocess.PIPE).
myPopen.stdin, myPopen.stdout, myPopen.stderr : les entrées et sorties standard, quand elles ont été mises a subprocess.PIPE dans le constructeur. myPopen.stdout est de la classe file.
</code> Exemple :
import subprocess s = subprocess.Popen(['bc','-q'],stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT) ... s.stdin.write(cmde+'\n') s.stdin.flush() res = s.stdout.readline() print "Resultat:",res s.stdin.close() s.stdout.close()
Commment puis-je détecter le type d'invocation GET ou POST de mon cgi-bin ?
RequestMethod
Compléments de Cours et de TD
Quelques Cours et Tutoriels sur Python
Exemple Gestion de Chaines de caractères
Exemple de code Python d'un client / Serveur
- Code Python d'un client et d'un serveur TCP/IP code_client_server_socket_python.zip
- Attention : les méthodes send, recv sur les sockets manipulent des bytes. Vous ne pouvez donc envoyer et recevoir directement des chaines de caractères. La méthode encode sur une chaine pour récupérer une liste de bytes et decode sur une liste de bytes pour récupérer la chaine de caractères correspondantes
- Attention ce code est prévu pour Python ⇐ 2.x. En python 3.x il faudar faire quelques modifications comme print à réécrire comme une fonction en print().