Salut Lien Franchement je me suis endormi, c'est tellement long . Va sur le http://www.w3.org/ ceux sont eux les pros :-) .Et tu verra que tout ce qui est dessus c'est de la peinture :-).
-- Ensuite une fois que tu auras capte toute la théorie ,regarde cette exemple que j'ai code pour toi pour la pratique --les fichiers sont joints au mail .Tu peux egalement le dowload sur git https://github.com/aliounedia/W3C https://github.com/aliounedia/W3C/blob/master/test_client.py https://github.com/aliounedia/W3C/blob/master/test_server.py -- Le serveur va te rerourne : ('Starting Http Server on %s %s', ('', 32)) ['Alioune Dia'] ['Voici les donnees que Alioune Souhaite envoye au serveur \ntest_serveur , en e sperant que tout marche sans problemes\n--Ad'] Alors que tout client a envoye :) ------------ThIs_Is_tHe_bouNdaRY_$ Content-Disposition: form-data; name="fichier"; filename="data_alioune.txt" Content-Type: text/plain Voici les donnees que Alioune Souhaite envoye au serveur test_serveur , en esperant que tout marche sans problemes --Ad ------------ThIs_Is_tHe_bouNdaRY_$-- 200 content-type: text/plain C:\PYTHON_SCRIPTS\mysoft2\W3C>python test_client.py data_alioune.txt filename data_alioune.txt filedata Voici les donnees que Alioune Souhaite envoye au serveur test_serveur , en esperant que tout marche sans problemes --Ad ------------ThIs_Is_tHe_bouNdaRY_$ Content-Disposition: form-data; name="nom" Alioune Dia ------------ThIs_Is_tHe_bouNdaRY_$ Content-Disposition: form-data; name="fichier"; filename="data_alioune.txt" Content-Type: text/plain Voici les donnees que Alioune Souhaite envoye au serveur test_serveur , en esperant que tout marche sans problemes --Ad ------------ThIs_Is_tHe_bouNdaRY_$-- 200 content-type: text/plain OK -- Le code client :) import httplib, mimetypes class W3Client: def __init__(self): self.files_fields ={} self.simple_fields ={} def __len__(self): return len(self.files_fields) + len(self.simple_fields) def add_field(self, key, value_or_file): ##la methode 'add_field' , permet d' ajouter une clef /valeur -- ##un form-field a notre client. La clef est naturellement un ##string et la valeur peu etre un soit un fichier ou simplement ##un string ## encoding = 'iso-8859-1' if hasattr(value_or_file,'read'): print value_or_file.name type = mimetypes.guess_type( value_or_file.name)[0] \ or 'application/octet-stream' data, filename= value_or_file.read().encode(encoding),\ value_or_file.name print 'filename', filename print 'filedata', data self.files_fields[key]=\ (data, (filename,type)) return # Sinon , nous somme en presence d un formulaire tres simple # clef/valeur pas de fichier , cool , on n a qu a le foutre # self.simple_fields self.simple_fields[key] = value_or_file def postMultipart(self): ##est la ou les choses interessantes vont venir , nous allons ##maintenant envoyer a 'test_server' notre formulaires -- ##self.self.files_fields et -- self.simple_fields. ##Comme W3 les stipule: ##<INPUT type="text" name="submit-name" value ="Larry"> ## ##correspond a ## ##Content-Disposition: form-data; name="submit-name" ## ##Larry # Creons une connection avec 'test_server' conn = httplib.HTTPConnection("localhost", "32") # Notre BOUNDARY BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$' contentType = 'multipart/form-data; boundary=%s' % BOUNDARY headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': contentType} body = "" a= [] CRLF = "\r\n" a_append =a.append for key, value in self.simple_fields.items(): a_append('--' + BOUNDARY) a_append('Content-Disposition: form-data; name="%s"' % key) a_append('') a_append(value) for key, (data, (filename, type)) in self.files_fields.items(): a_append('--' + BOUNDARY) a_append('Content-Disposition: form-data; name="%s"; filename="%s"' % ( key, filename)) a_append('Content-Type: %s' % type) a_append('') a_append(data) # a_append('--' + BOUNDARY + '--') a_append('') body = CRLF.join(a) print body conn.request('POST', "http://localhost/", body.encode("iso-8859-1"), headers) response = conn.getresponse() conn.close() print response.status, response.read() if __name__=="__main__": w3c= W3Client() w3c.add_field("nom", "Alioune Dia") w3c.add_field("fichier", open("data_alioune.txt")) # Avant denvoyer ca au serveur, verifie que le serveur est lance en tapant # python test_server.py # Si ca run , tu dois voir sur la console # ('Starting Http Server on %s %s', ('', 32)) w3c.postMultipart() --Serveur from BaseHTTPServer import BaseHTTPRequestHandler , HTTPServer import cgi class MyServer(HTTPServer): pass ## Voici un serveur basic qui ne fait que utiliser Heriter la ## class HTTPServer de python , cette serveur va nous permettre ## de tester et de comprendre les notions du w3C sur le traitement ## des requetes HTTP, depuis un client (Programme client.py), nous ## allons lui envoyer deux formulaires l un ne contenant que des fields ## (key, value), il faut nous affiche le formulaire sur la console. ## L'autre formulaire que nous allons lui envoyer va contenir un ## formulaire contenue une clef , valeur , mais cette fois ci nous ## allons envoye un fichier comme valeur , enfin le contenu ## du fichier comme nous le specifie W3C. class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): ## Notre handler def do_POST(self): form = cgi.FieldStorage( self.rfile, headers = self.headers, environ = { "REQUEST_METHOD": "POST" , "CONTENT_TYPE" : self.headers['Content-Type'] } ) for key in form.keys(): v = form.getlist(key) print v self.response(200, "OK") return def response(self,code, output): self.send_header("content-type", "text/plain") self.end_headers() self.wfile.write(output) return code if __name__ == "__main__": server_address = ('', 32) server= MyServer(server_address, SimpleHTTPRequestHandler) print("Starting Http Server on %s %s", server_address) try: server.serve_forever() except KeyboardInterrupt: print("\nKeyboard interrupt received, exiting.") server.server_close() sys.exit(0) --Ad Le 14 février 2013 18:07, Lien Rag <[email protected]> a écrit : > Le 08/02/2013 10:37, Oumar FALL a écrit : > > PS: @LienRag, je t'ai envoyé une réponse en te proposant une librairie PHP > (Goutte). Tu l'as regardé?? > > Pas encore, tu sais bien que je ne veux jamais faire le moindre effort... > ;-) > > Plus sérieusement, je crois que vous sous-estimez grandement la barrière à > l'entrée de la programmation moderne. > Nul n'est bon juge de lui-même et je suis donc incapable d'évaluer avec > justesse le sérieux ou le manque de sérieux de ma démarche d'apprentissage, > mais je sais que le tout petit peu que j'arrive à faire est déjà > insurmontable pour la majorité des sénégalais (ou des non-sénégalais > d'ailleurs) avec qui je discute. > > Quand un programmeur averti programme et que ça ne marche pas, ça lui > confirme juste qu'il est en train de programmer (c'est quand ça marche qu'il > est étonné!). Quand un débutant programme et que ça ne marche pas, c'est > une remise en question existentielle qui provoque une assez forte angoisse: > "pourquoi les machines m'en veulent à moi? Qu'est-ce que je leur ai fait? > Aurais-je dû sacrifier un poulet à la fonction en cours et est-elle fâchée > que je ne l'ai pas fait? Skynet va-t'il me confondre avec Sarah Connor?" (et > c'est quelque chose que j'ai observé - en un peu moins coloré certes - chez > tous les débutants que j'ai pu tenter d'initier, et surtout tous ceux qui > n'osent même pas commencer), c'est probablement un point qu'il est difficile > de percevoir lorsque l'on a dépassé ce stade il y a longtemps. > > > Sans compter qu'aussi blasphématoire que cela puisse paraître à vos yeux, > l'apprentissage de Python ou d'un autre langage de programmation n'est pas > pour moi un but en soi, mais un moyen pour arriver à une fin (régler mon > problème immédiat d'automatisation de certaines tâches internet, me préparer > à pouvoir gérer plus facilement des besoins futurs d'automatisation de > tâches informatiques non encore définies, participer au mouvement général de > démocratisation des connaissances techniques). > > Plus blasphématoire encore, je n'ai pas l'intention de changer sur ce point, > d'ailleurs. > > Quelqu'un m'a dit que les communautés (Python, Ruby et bien d'autres) ne > cherchent pas à avoir des "programmeurs" qui ne fournissent aucun effort > pour résoudre les problèmes qu'ils rencontrent. > Au-delà de la confusion entre refuser de fournir un effort et chercher à > éviter les efforts inutiles*, la référence à une communauté me paraît être > une des sources d'incompréhension. > > La notion de communauté vient des américains, et a une assez forte > connotation religieuse - il me semble même qu'elle vient en grande partie de > la forme particulière d'organisation du christianisme prise lors de la > constitution des USA, de la conquête du territoire et du génocide des > autochtones. > > Elle ne me paraît donc pas pertinente pour décrire ni l'expérience humaine > en général ni la promesse d'émancipation qu'apporte le logiciel libre. > > Je n'ai donc pas l'intention d'intégrer une "communauté", Python ou autres, > mais d'apprendre un langage qui correspondra à mes besoins et que je > pourrais éventuellement apprendre à qui en aura ensuite besoin, restituant > l'aide que j'aurais reçue non à une communauté mais à l'humanité. > > Et à mon niveau, passer d'un langage à l'autre est assez perturbant - donc > j'ai mis Goutte dans un coin et j'y reviendrais quand j'aurais le temps ou > l'énergie, ou si tu as le temps et l'énergie de me l'expliquer en direct à > une prochaine rencontre. > > D'ailleurs Alioune si on se voit le 23 et que cela te dit, j'aimerais bien > que tu m'expliques ce que tu disais sur les recommandations du W3C, je n'y > ai rien compris mais ça a l'air d'être le niveau d'abstraction qui > m'intéresse. > Tu pourras également, toujours si tu en as le temps, l'énergie et l'envie, > m'expliquer un peu mieux > ton code : _recurse(node) ressemble à une façon élégante de procéder, à > laquelle je n'aurais certainement pas pensé tout seul. Mais j'ai du mal à > comprendre ce que tu lui passes comme argument, et je ne vois pas de test > sur le sous-dossier à traiter. > Au fait j'ai probablement fait une erreur en demandant un dictionnaire, à la > réflexion un simple tuple devrait suffire. > Et oui, cela irait plus vite si je t'envoyais le fichier bookmark.html à > traiter, mais en fait et vu ma vitesse de traitement et puisqu'il y a pour > l'instant moins d'une soixantaine d'URLs, j'aurais probablement aussi vite > fait de faire le copier-coller et le rechercher-remplacer à la main. > C'est donc surtout comme exercice (et aussi pour pouvoir reprendre la même > méthode si j'améliore la macro initiale un jour) que je cherche à le > scripter. > Mais je pense que je vais faire un premier essai en trichant un peu, en > faisant un copier-coller (encore un!) de la partie qui m'intéresse de > Bookmarks.html dans un fichier texte et en remplissant mon tuple à partir de > ce fichier. > > Pour l'instant je me contente d'iMacro même si j'ai beaucoup de mal à tester > ces temps-ci du fait de ma connexion pourrie qui dépasse rarement le 0,5 > ko/s depuis quatre jours** et qui fait que les macros que j'écris plantent à > peu près toutes avant la fin de leur exécution, au moins une des pages > appelées refusant de se charger. Sans compter que plusieurs des tutoriels > sont en vidéo, donc non chargeables avec une telle connexion. > Mais bon malgré tout je pense avoir réussi à a peu près optimiser ma macro, > en tous cas par rapport à mes capacités de codeur, donc re-merci Genova. Le > seul problème qui reste est que iMacro n'est batchable qu'en version > payante, donc pour me faire un lanceur il va falloir bricoler et je ne sais > pas trop comment. > > En fait j'ai trois solutions, lancer une fenêtre Firefox sur une URL précise > et y appeler une macro générique (puis recommencer sur les environ 60 URLs > concernées), ou scripter la création d'une macro géante en faisant boucler > le copier-coller du code de la macro optimale et le rechercher-remplacer de > l'URL à l'intérieur de ce code (visiblement je dois être un criminel > endurci: non seulement je pratique le copier-coller de code, mais je boucle > dessus qui plus est! Dieu aie pitié de mon âme...) et la lancer à la main, > ou scripter la création de 60 macros par la même boucle et les lancer une > par une par le lanceur que je ne sais pas coder. > > Donc là encore, s'il y a quelqu'un qui n'est pas rebuté par ma maladresse > informatique et ma pratique blasphématoire du copier-coller, il peut > éventuellement me dire comment faire (enfin la deuxième méthode je dois > pouvoir y arriver seul, mais ce n'est pas très élégant et laisse tout le > processus à la merci d'une erreur ou d'une perte de connexion lors des > premiers passages)... > > > > (*) Je sais que j'ai infiniment moins d'expérience que vous, mais jusqu'à > présent je ne vois pas en quoi copier-coller le code d'Alioune (par exemple) > dans un IDE pour le passer au débuggeur et suivre son exécution pas à pas > est une mauvaise méthode d'étude (oui je sais, les Vrais Informaticiens > parsent à la main, mais je n'ai jamais prétendu en être). > Ni quelle est l'utilité pédagogique d'avoir à corriger une cinquantaine de > syntax error uniquement dues au fait que Python est incapable de gérer > proprement le copier-coller. > A la limite il est vrai que pour un débutant, recopier le code à la main > ligne par ligne ou bloc par bloc facilite la mémorisation, mais il n'est pas > clair que cela rentabilise le temps que cela demande, surtout si l'on tient > compte du temps qu'il faudra passer à corriger les fautes de frappe. > > (**) Enfin le logiciel d'e-express m'annonce entre 50 et 200 ko/s - sur 3 > Mo/s vendus - mais Bittorrent m'annonce entre 2 et 5 ko/s et le total des > téléchargements ne fait que rarement plus que 0,5 ou 1 ko/s, > exceptionnellement 10 ko/s; et les pages firefox ne se chargent que très > difficilement; comme je n'ai pas trouvé de logiciel de surveillance du débit > réel et que l'atelier prévu au Barcamp pour expliquer comment fonctionne et > se répartit la connexion n'a pas eu lieu, je peux difficilement être plus > précis. >
Voici les donnees que Alioune Souhaite envoye au serveur test_serveur , en esperant que tout marche sans problemes --Ad
test_client.py
Description: Binary data
test_server.py
Description: Binary data
-- Ce message a été envoyé à la liste [email protected] Gestion de votre abonnement : http://dakarlug.org/liste Archives : http://news.gmane.org/gmane.org.user-groups.linux.dakarlug Le site du DakarLUG : http://dakarlug.org
