Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exécution de script avec cherrypy

    18 mars 2011 à 12:42:04

    Bonjour a tous,

    Voila je dois realiser un site web me permetant d'entrer les paratres pour creer un callfile asterisk lesquels seront redirigés vers un script python qui lui créera ce callfile.
    J'utilise donc cherrypy mais j'ai un probleme lors de l'appel du script.

    le programme principal :
    import cherrypy
    import os
    
    class Home(object):
        def index(self):
            return '''
          <HTML>
    <HEAD><TITLE>Exercice avec Python</TITLE></HEAD>
    <BODY>
    <DIV ALIGN="center">
    <H2>Page Web interactive</H2>
    <P>Cette page est associée à un script Python</P>
    <FORM ACTION="input_query.py" METHOD="post">
    <INPUT TYPE="submit" NAME="send" VALUE="Exécuter le script">
    </FORM>
    </DIV></BODY></HTML>'''
    
    
        index.exposed=True
    
    
    cherrypy.quickstart(Home(),config="tutoriel.conf")
    


    et le fichier de configuration

    #! /usr/bin/python
    # -*- coding: utf-8 -*-
    # Affichage d'un formulaire HTML simplifié :
    
    print "Content-Type: text/html\n"
    
    print """
    
    <H3><FONT COLOR="Royal blue">
    Page web produite par un script Python
    </FONT></H3>
    <FORM ACTION="print_result.py" METHOD="post">
    <P>Veuillez entrer votre nom dans le champ ci-dessous, s.v.p. :</P>
    <P><INPUT NAME="visiteur" SIZE=20 MAXLENGTH=20 TYPE="text"></P>
    <P>Veuillez également me fournir une phrase quelconque :</P>
    <TEXTAREA NAME="phrase" ROWS=2 COLS=50>Mississippi</TEXTAREA>
    <P>J'utiliserai cette phrase pour établir un histogramme.</P>
    <INPUT TYPE="submit" NAME="send" VALUE="Action">
    </FORM>
    """
    


    Lorsque je clique sur le bouton de la page web principale, j'ai l'erreur suivante :
    404 Not Found
    
    The path '/input_query.py' was not found.
    
    Traceback (most recent call last):
      File "/usr/local/lib/python3.2/dist-packages/cherrypy/_cprequest.py", line 646, in respond
        response.body = self.handler()
      File "/usr/local/lib/python3.2/dist-packages/cherrypy/lib/encoding.py", line 188, in __call__
        self.body = self.oldhandler(*args, **kwargs)
      File "/usr/local/lib/python3.2/dist-packages/cherrypy/_cperror.py", line 387, in __call__
        raise self
    cherrypy._cperror.NotFound: (404, "The path '/input_query.py' was not found.")
    


    Je pense que ca vient d'un problème dans la définition des dossiers dans le fichier conf mais je ne trouve pas.

    J'espere que quelqu'un saura m'aider :)

    merci
    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2011 à 13:30:35

      Salut.

      Alors non, le problème ne vient pas du tout de la configuration mais plutôt du fait que tu n'as pas compris comment fonctionnait CherryPy (en particulier comment on définissait les "pages").

      Voici un exemple dans lequel, lorsque tu cliques sur le bouton "démarrer le script" il te retourne vers une nouvelle page affichant "Ça marche !" :

      # -*- coding: utf-8 -*-
      import cherrypy
      
      page = \
      """
      <html>
          <head>
              <meta charset="utf-8" />
              <title>Page interactive</title>
          </head>
          <body>
              <h2>Page interactive</h2>
              <form method="POST" action="demarrer">
                  <input type="submit" value="Exécuter le script" />
              </form>
          </body>
      </html>
      """
      
      page2 = \
      """
      <html>
          <head>
              <meta charset="utf-8" />
              <title>Page interactive - Démarrer</title>
          </head>
          <body>
              <h2>Ça marche !</h2>
          </body>
      </html>
      """
      
      class Root(object):
          @cherrypy.expose
          def index(self):
              return page
      
          @cherrypy.expose
          def demarrer(self):
              return page2
      
      cherrypy.quickstart(Root())
      


      Comme tu le vois, le formulaire appelle la page "demarrer".
      J'ai donc créé une méthode demarrer dans la classe Root, que j'ai choisi "d'exposer" au moyen du décorateur prévu à cet effet.

      Cela a pour effet d'associer tout appel à la page "demarrer" au code contenu dans cette méthode.
      D'où le résultat.

      Si ton formulaire envoyait des paires "clé/valeur", il te suffirait de les récupérer via les arguments de la méthode correspondant à la page appelée.

      Comme ceci :

      # -*- coding: utf-8 -*-
      import cherrypy
      
      page = \
      """
      <html>
          <head>
              <meta charset="utf-8" />
              <title>Page interactive</title>
          </head>
          <body>
              <h2>Page interactive</h2>
              <form method="POST" action="demarrer">
                  <input placeholder="Votre nom ?" name="nom" /><br/>
                  <input type="submit" value="Exécuter le script" />
              </form>
          </body>
      </html>
      """
      
      page2 = \
      """
      <html>
          <head>
              <meta charset="utf-8" />
              <title>Page interactive - Démarrer</title>
          </head>
          <body>
              <h2>Bonjour, {0} !</h2>
          </body>
      </html>
      """
      
      class Root(object):
          @cherrypy.expose
          def index(self):
              return page
      
          @cherrypy.expose
          def demarrer(self, nom):
              return page2.format(nom)
      
      cherrypy.quickstart(Root())
      


      Dans cet exemple, j'envoie un champ "nom" à ma seconde page, ma méthode demarrer accepte donc un argument "nom", et (c'est là que ça devient intéressant), il s'en sert pour "formatter" la chaine de caractères représentant la page de résultat.

      Dans une application "de la vie réelle", tu ne tapes pas vraiment tes pages comme ça, mais tu utilises des templates (fichiers) html que tu charges pour créer tes pages au moyen d'un moteur de templates comme Jinja2 (ça ressemble beaucoup à la méthode "format", mais en beaucoup plus puissant), mais dans le cadre de ton exercice, te servir de la méthode format suffit largement dans un premier temps. ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        18 mars 2011 à 13:44:07

        Alors dans le cas ou je veux traiter les parametres pour qu'ils soient ecrit dans un fichier donc qu'il n'y ai pas de retour pour l'utilisateur (formatage des parametres sur une page html) je serais quand meme obligé de passer par une autre page???Parce que l'exemple de l'appel d'un script j'avais trouvé ca dans un tuto et jtrouvais ca vraiment pas mal maintenant si je ne sais pas le faire ca m'alourdirais la tache :/



        le dit tuto :)
        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2011 à 13:46:58

          Non, t'es pas obligé d'appeler une page de résultat différente (il faut juste qu'il y ait quelque-chose qui s'affiche pour l'utilisateur, sinon il ne saura pas si ça a réussi ou planté).

          Il te suffit, par exemple, d'écrire dans ton fichier dans la méthode "demarrer" et de retourner ce que tu veux montrer à l'utilisateur (par exemple la page d'accueil).
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
          Anonyme
            18 mars 2011 à 13:49:41

            Hummm... Va falloir que je m'y mette à ce cherrypy, il est vraiment intéressant et simple d'utilisation.

            Je vais bientôt moi aussi poser des questions sur ce cherrypy, enfin si je m'en sors pas :)
            • Partager sur Facebook
            • Partager sur Twitter
              18 mars 2011 à 13:50:42

              en fait le projet est un peu plus compliqué que la manière dont le le présente, parce que le site+script en cherrypy sera appelé et inclus dans un site général et donc le script retournera un 1 ou 0 au site maitre pour dire si ca s'est bien passé ou pas...je sais pas si je m'exprime clairement :/

              ps: j'ai rajouté le liens du tuto dans le post précédent
              • Partager sur Facebook
              • Partager sur Twitter
                18 mars 2011 à 14:08:50

                Ce qu'il faut bien comprendre c'est que CherryPy sert ni plus, ni moins, à traiter les requêtes HTTP :

                Ton site reçoit une requête HTTP pour la page "index".
                -> CherryPy décortique la requête
                -> Appelle la méthode "exposée" index
                -> Récupère son résultat
                -> Retourne le résultat à l'émetteur de la requête.

                Ton site reçoit une requête HTTP pour la page truc avec des données par la méthode GET ou POST (aucune différence)
                -> CherryPy décortique la requête et les données
                -> Appelle la méthode truc en lui passant en argument les données GET (ou POST)
                -> Récupère le résultat de la méthode
                -> Retourne le résultat.

                CherryPy ne fait, fondamentalement, rien d'autre que ça, mais c'est déjà largement suffisant, parce que ça te laisse libre de faire tout ce que tu veux dans les méthodes en question ;).

                Ce que je veux dire par là, c'est que ton script "métier" (qui fait tout le boulot du service web que tu crées) n'a plus à s'emmerder avec les requêtes ou les pages : il offre à l'extérieur la même interface que s'il s'agissait d'un programme avec GUI ou en console. Et à ce moment là, dans les méthodes "exposées" à CherryPy, tu n'as plus qu'à appeler les méthodes de ton script métier, récupérer le résultat et t'en servir pour "cuisiner" ("to cook" en anglais est utilisé dans ce sens) la page de résultat que tu retournes à l'utilisateur pour lui dire que tout s'est bien déroulé.

                Au fond, CherryPy te permet de séparer totalement la vue du reste (modèle/contrôleur ou modèle/délégué) de ton programme.
                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  18 mars 2011 à 14:14:36

                  c'est vrai qu'en fait jsuis un peu C** j'avais pas pensé que jpouvais exécuter des instructions sans avoir besoin d'appeler une page ou un script :D
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Exécution de script avec cherrypy

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown