SkayaWiki

PythonTD5

JeromePetazzoni :: DerniersChangements :: DerniersCommentaires? :: ParametresUtilisateur :: http://www.enix.org/ :: Vous êtes ec2-3-238-71-155.compute-1.amazonaws.com
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)
- pour implémenter le module "magique" : écrire une classe "fakemodule" par exemple, contenant des méthodes "reload" et "shutdown", et enregistrer "en dur" cette classe pour l'entrée "_" de la table des modules

httppickle


http://docs.python.org/lib/httplib-examples.html
Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]