Ceci est une version archivée de
PythonTD5 à 2006-02-21 23:42:14.
Première étape : httpplug -- dans n'importe quel programme Python, permet d'exporter les méthodes, variables... afin qu'elles soient accessibles en HTTP.
Deuxième étape : httpbean -- serveur HTTP
standalone, permettant d'accéder aux scripts, modules... contenus dans un répertoire donné, à travers le protocole HTTP.
Troisième étape : invocation distante sur HTTP/Pickle.
httpplug
Le but est d'écrire un module, appelé httpplug, contenant une classe, appelée httpplug elle aussi. Le but de cette classe est de rendre accessible des variables, fonctions... À partir d'un serveur Web embarqué.
Par exemple : on suppose qu'on dispose d'un programme Python contenant des fonctions et variables :
def cat(str1, str2): return str1+str2
def printcat(str1, str2): print str1, str2
x=1
s="coin"
On ajoute simplement les lignes de code suivantes :
import httpplug
p=httpplug.httpplug(8000) # serveur HTTP sur le port 8000
p.plug(cat=cat)
p.plug(cat2=printcat)
p.plug(x=x, ma_chaine=s)
Les invocations de la méthode
plug servent à « publier » une fonction/variable sur une URL donnée. Ainsi, aller sur :
-
http://localhost:8000/cat/titi/toto doit appeler la fonction cat avec "titi" et "toto" comme paramètres
-
http://localhost:8000/cat2/abc/def doit appeler la fonction printcat (puisqu'on a appelé plug avec cat2=printcat) avec "abc" et "def" comme paramètres
-
http://localhost:8000/x affiche la variable x
-
http://localhost:8000/ma_chaine affiche la variable s
Pour publier toutes les variables d'un programme, on pourra faire
p.plug(**globals())
Pas à pas :
- implémenter à l'aide de
http://docs.python.org/lib/module-BaseHTTPServer.html un serveur HTTP très simple affichant juste les paramètres de la requête.
- décomposer certains paramètres (le chemin en particulier) afin d'extraire les différentes composantes du chemin
- le mettre dans une classe
httpplug, et faire en sorte que la classe soit threadée, pour que la construction d'une instance lance le serveur dans un thread séparé.
- rajouter la méthode
plug à cette classe (facile, il suffit d'ajouter le(s) paramètre(s) à une table de hash).
- faire en sorte qu'une requête consulte la table de hash ; si l'élément est une fonction, on l'appelle ; sinon on l'affiche simplement
- rediriger la sortie des fonctions (sys.stdout=...) de façon à afficher séparément les "print" de la valeur de retour de la fonction
httpbean
Le but est d'écrire un module httpbean, contenant une classe httpbean, permettant de construire un « conteneur » de modules Python. Ce conteneur est un serveur Web qui, lorsqu'on accède à l'URL
/titi/toto/a/b, va chercher dans le module
titi la fonction
toto et l'appeler avec pour paramètres "a" et "b".
Ainsi, si on dispose d'un fichier
coin.py contenant :
def mult(a,b): return str(int(a)*int(b))
Puis que dans le répertoire de ce fichier, on lance :
import httpbean
httpbean.httpbean(8000)
Si on se rend à l'URL
http://localhost:8000/coin/mult/3/5 , on doit voir s'afficher le résultat 15.
On utilisera un nom de module "magique",
_, pour appeler les méthodes de httpbean lui-même ; on voudra pouvoir faire :
-
http://localhost:8000/_/reload/toto (pour recharger le module correspondant)
-
http://localhost:8000/_/shutdown (pour mettre fin au serveur)
Pas à pas :
- repartir du programme précédent ; utiliser
__import__ pour importer un module "à la main".
- stocker les modules dans une table de hachage
- pour savoir si un module contient un élément donné : hasattr(moduleobject, elementname)
- pour récupérer l'élément correspondant : getattr(moduleobject, elementname)
httppickle
http://docs.python.org/lib/httplib-examples.html