Python TD6

Python et les services web



Les services web sont des programmes permettant la communication et l'échange de données entre applications et systèmes hétérogènes dans des environnements distribués.
Les services web de type WS-* exposent des services exécutables à distance (Remote Procedure Call). Leurs spécifications reposent sur les standards SOAP et WSDL.
Les services web de type Representational state transfer (REST) exposent entièrement ces fonctionnalités comme un ensemble de ressources (URI) accessibles par le protocole HTTP. REST n'est pas un standard, mais un style d'architecture.
La distribution standard de Python fournit des modules pour le protocole xmlrpc, et un standard, WSGI (Web Server Gateway Interface), une interface entre serveurs web et applications écrites en Python.
Des modules tiers facilitent l'implantation de serveurs REST.



Exercice 1
Lorsque le protocole SOAP a été introduit, il existait un serveur destiné à tester les clients.
Il renvoyait des injures aléatoires puisées dans le répertoire du capitaine Haddock (en anglais).
Cette institution ayant disparu, nous avons installé (provisoirement) un service similaire sur le serveur de l'IGM,
http://monge.univ-mlv.fr:8888
Pour n'utiliser que les ressources natives de Python, nous avons employé le protocole xmlrpc (qui est l'ancêtre de SOAP) de sorte que l'accès au serveur ne nécéssitera que deux ou trois lignes de Python, l'une d'entre elles consistant à importer une classe du module xmlrpclib.
0) Parcourir rapidement la documentation du module xmlrpclib.
1) Le serveur accepte l'introspection. Découvrir ses méthodes, et les essayer.
2) Ecrire un serveur identique et le lancer sur "localhost" (voir la documentation de SimpleXMLRPCServer).
En python 3, les modules s'appellent xmlrpc.client et xmlrpc.server.


Exercice 2
Bien que le protocole xmlrpc soit assez primitif, il est suffisant pour de petites applications, et il existe encore de nombreux serveurs, par exemple celui de PyPi (Python Package Index).
1) Lancer l'interpréteur Python, et essayer les commandes de l'exemple donné sur la page web. Essayer aussi listMethods et comparer avec la liste donnée sur la page.
Ne pas essayer list_packages() (pourquoi ?).
2) Toujours depuis l'interpréteur Python, rechercher un paquetage lié à la plateforme (framework) Flask permettant d'écrire facilement un serveur de type REST.
On utilisera pour cela la méthode browse, les trove classifier strings sont ici.
On fera d'abord imprimer les noms des paquetages trouvés avec leur champ summary, puis le champ description du paquetage sélectionné.



Exercice 3
Récuperer le paquetage restlite. Il ne nécessite pas d'installation, et son code tient dans un seul fichier de taille modeste restlite.py. Il s'appuie sur le module (complexe) wsgiref de Python (ne pas lire la documentation maintenant).
Le fichier example.py montre les diverses possibilités.
Écrire un serveur d'injures du capitaine Haddock sur ce modèle.
1) On devra pouvoir obtenir une injure en tapant
curl http://127.0.0.1:8888/juron ou depuis Python avec urllib.urlopen.
2) On remarque que, contrairement au serveur xmlrpc, on obtient quelque chose en accédant à l'url ci-dessus avec un navigateur. Profiter de cette circonstance pour implémenter une méthode renvoyant une liste de n jurons sous forme d'une page html convenablement formatée lorsqu'on consulte l'url http://127.0.0.1:8888/jurons?nombre=42.
3) Imaginez des fonctionalités supplémentaires, et implémentez les avec la syntaxe simplifiée utilisant le décorateur @restlite.resource.
exemple : http://monge.univ-mlv.fr:8889
4) Reprogrammez un serveur identique en utilisant Flask.