IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[python] en remplacement de [php] [cherrypy]


Sujet :

Python

  1. #1
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut [python] en remplacement de [php] [cherrypy]
    Salut,

    En fait ce fil devrait s'appeler "python en remplacement de php grâce à la bibliothèque cherrypy". Mais sauf erreur de ma part la rubrique "python/bibliothothèque tierce" n'existe pas. Il fait suite a cet autre fil.

    Comme dit, j'aimerai résoudre mon problème de façon "pythonesque", c'est à dire avoir un serveur apache/php (genre port 8080) qui s'occuperait du boulot normal d'un serveur, et un deuxième serveur python/cherrypy qui répondrait aux requêtes ajax qui apparaitraient sur un autre port, le 8000, par exemple.

    J'ai donc installé cherrypy en suivant ce lien. Je suis sous windows XP python 2.7. Je démarre les serveur apache et cherrypy (grâce à l'exemple ci-dessous) puis j'ouvre un navigateur quelconque (firefox au hasard)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import cherrypy
     
    class HelloWorld(object):
        def index(self):
            return "Hello World!"
        index.exposed = True
     
    cherrypy.quickstart(HelloWorld())
    j'appelle les pages du serveur apache sans problème sur localhost sans problème. J'appelle également localhost:8000 et c'est bien cherrypy qui me répond en affichant dans le navigateur le contenu de son répertoire.

    Quelques questions en vrac:

    -A quoi sert la classe "HelloWorld?"

    - Est-on obligé de créer des threads? Car une fois que la requête ajax a été reçue, décodée et exécutée avec envoi de réponse, il n'y a pas de raison de garder une liaison avec le navigateur?

    A+

    Pfeuh

    P.S. En posant ma dernière question, je me suis demandé si je ne faisais pas fausse route avec les 2 serveurs séparés... Car si une page est créée sur le navigateur avec le serveur apache, il n'y a aucune raison qu'elle puisse dialoguer avec le serveur cherrypy?

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    La classe HelloWorld est une sorte de générateur de page. Sa fonction index() représente sa racine locale (“./”, en quelque sorte), et ce qu’elle retourne sera donc le contenu de cette racine.

    Tu peux rajouter à ta classe une fonction test(), par exemple. Du moment que tu l’exposes (test.exposed = True), elle correspondra à l’address (relative à celle de HelloWorld) “./test/”, etc.

    Donc, si tu enregistres HelloWorld comme racine de ton site (ce que tu fais en la passant à cherrypy.quickstart()), HelloWorld.index() sera appelée pour l’adresse “ton.site.org/”, et HelloWorld.test(), pour l’adresse “ton.site.org/test/”… C’est la technique par défaut de cherrypy, il y en a d’autres de possibles (à base de regex, notamment, un peu comme sous django). Elle a l’avantage d’être simple, mais elle “fige” quelque peu la structure du site dans le code.

    Note que tu peux emboîter comme ça autant de classes que tu veux.

    Pour ta deuxième question, je ne comprends pas trop… Il n’y a pas de liaison permanente avec le navigateur, comme en PHP, quand cherrypy reçoit une requête, il la décode, la passe à la fonction idoine (en fonction du path, index(), test(), etc.), récupère la valeur renvoyée par celle-ci et l’encode avant de l’envoyer en réponse, et c’est tout.

    Sinon, cherrypy est totalement compatible wsgi, donc tu peux l’interfacer sans problème avec apache, normalement. Mais la solution à deux serveurs (apache + cherrypy) sur deux ports différents devrait aussi fonctionner, amha… Tant que l’adresse est la même, normalement, les navigateurs ne devraient pas bloquer*!

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Bon, après quelques (dizaines d') heures à ramer là dessus (les réseaux, ce n'est vraiment pas ma culture) J'ai réussi à faire marcher mes requêtes ajax en php, mais pas en python/cherrypy, je suis sûr qu'il ne manque pas grand-chose... J'ai joint un exemple minimum, si quelqu'un a une idée.

    A+

    Pfeuh
    Fichiers attachés Fichiers attachés

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Bonjour,

    J'ai réussi à faire tourner ton code moyennant deux modifications.

    Dans answerer.py la chaîne de retour de la fonction "answerer" contient pas de "&" nécessaire à ta fonction "getUrlParams" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def answerer(self, **kwds):
            retstring = ""
            if len(kwds):
                retstring = "?"+"&".join(["%s=%s"%(key,str(int(val)+1)) for key,val in kwds.iteritems()])
            return retstring
    dans index.html il manque le "http://" au début de l'url.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var answererPython = "http://127.0.0.1:8080/answerer";

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par Alexis.M Voir le message
    Bonjour,

    J'ai réussi à faire tourner ton code moyennant deux modifications.
    Là, je suis au bord de la mer en vacances et je profite d'un accès inattendu au web. Merci, c'était donc de l'étourderie, j'aurais pu chercher longtemps! Je me remets sur le projet début août, encore merci.

    A+

    Pfeuh

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Si tu bosses encore, j'ai une mini appli avec ajax, template sur un framework similaire à cherrypy, bottelpy...dans mon application simple de consultation RSS, tu verras rapidement comment on procède.

    Par exemple j'ai la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @bottle.route('/meteo/:code')
    def meteo(code):
        """
        Meteo webservice
        """
        try:
            rf = pymetar.ReportFetcher(code)
            rep = rf.FetchReport()
        except Exception, e:
            return str(e)
        rp = pymetar.ReportParser()
        pr = rp.ParseReport(rep)
     
        return {'station': code, 'namestation': pr.getStationName(), 
        'temp': str(pr.getTemperatureCelsius()),'humidite': str(pr.getHumidity()),
        'vent': str(('%0.2f') % (pr.getWindSpeed()*36/10)),
        'pression':str(int(pr.getPressure())), 'temps': str(pr.getWeather())}
    Et dans mon template (pour l'ajax)

    <script type="text/javascript" charset="utf-8">
    $(function() {
    $("#tit").corner();
    });
    function Grab(url,idd) {
    $.getJSON(url,
    function(data) {
    $(idd).html(

    '<table>' +'<tr><td><div class="tititmeteo">' + data.station +
    '</div></td><td><div class="tititmeteo2">' + data.namestation +
    '</div></td></tr>' + '<tr><td>Température</td><td>' + data.temp +
    ' °C</td></tr><tr><td>Humidité</td><td>' + data.humidite +
    ' %</td></tr><tr><td>Vent</td><td>' + data.vent +
    ' Km/h</td></tr><tr><td>Pression</td><td>' + data.pression +
    ' hPa</td></tr><tr><td>Prévision</td><td>' + data.temps +
    '</td></tr>' + '<tr><td></td><td></td></tr></table>').
    corner();
    });
    }
    %for station in stations:
    Grab('meteo/{{station}}','#{{station}}');
    setInterval( "Grab('meteo/{{station}}','#{{station}}')", 300000 );
    %end
    </script>
    Si tu as besoin de plus d'explications, n'hésite pas.

Discussions similaires

  1. [python] en remplacement de [php]
    Par pfeuh dans le forum Général Python
    Réponses: 10
    Dernier message: 12/07/2011, 20h51
  2. Un graphe Python via du contenu Php ..
    Par peephole83 dans le forum Général Python
    Réponses: 1
    Dernier message: 18/03/2011, 18h19
  3. Transposer deux lignes de Python en C ou Php
    Par acryline dans le forum Général Python
    Réponses: 4
    Dernier message: 12/08/2010, 15h30
  4. python en remplacement du HTML, CSS, javascript et PHP ?
    Par Orfvz dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 04/02/2010, 06h31
  5. Framework léger pour remplacement application php
    Par Invité dans le forum Frameworks Web
    Réponses: 17
    Dernier message: 11/12/2006, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo