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

Attachment: test_client.py
Description: Binary data

Attachment: 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

Répondre à