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

Contribuez Python Discussion :

Un micro serveur web de calcul scientifique sur son PC!


Sujet :

Contribuez Python

  1. #1
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut Un micro serveur web de calcul scientifique sur son PC!
    Bonjour,

    Avec Python, on peut faire des choses étonnantes! Je vous propose ici un tout petit serveur web créé avec Python3 (>=3.5) avec appel à des scripts Python par CGI. Ce qui permettra de créer une mini calculatrice scientifique, disponible à tout moment avec n'importe quel navigateur web.

    On peut créer ce serveur sur son PC, mais aussi sur son réseau local (avec une adresse IP fixe sur le PC qui a le serveur).

    Sur le disque dur du PC, créer la structure suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    serveur  => répertoire principal
        serveur.py  => script qui lancera le serveur web
     
        public => répertoire du site web
             index.html  => page html qui sera appelée par un navigateur
             cgi-bin  => répertoire pour héberger les scripts Python qui pourront être appelés par CGI
                 calcul.py  => page Python de la calculatrice
                 calculsup.py  => page qui contient les fonctions de calcul supplémentaires
    Voilà le code du serveur ("serveur.py"):

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/usr/bin/python3
    # -*- coding: utf-8 -*
     
    """
    Micro-serveur web avec CGI
    """
     
    import http.server
     
    port = 8888
    adresseserveur = ("", port)
     
    serveur = http.server.HTTPServer
     
    gestionnaire = http.server.CGIHTTPRequestHandler
     
     
    gestionnaire.cgi_directories = ["/cgi-bin"]
     
    print("Serveur actif sur le port :", port)
     
    httpd = serveur(adresseserveur, gestionnaire)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        httpd.socket.close() # arrêt du serveur avec Cle-C au clavier
    Pour le lancer, on affiche une console (cmd.exe sous Windows), on se place dans le répertoire "public", et on lance le serveur:

    qui répond:

    Serveur actif sur le port : 8888
    C'est fait! Vous avez un (mini) serveur web! Fabriquez maintenant un fichier "index.html" que vous placez dans "public" pour vérifier qu'il marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    </head>
    <body>
    <p>Vous avez le bonjour de Tyrtamos!!!</p>
    </body>
    </html>
    Vous prenez ensuite votre navigateur préféré (pour moi, c'est Firefox), et vous appelez:

    Et il doit s'afficher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vous avez le bonjour de Tyrtamos!!!
    Bien. Maintenant, passons au CGI. Le script principal de calcul est "calcul.py" placé dans le répertoire "public/cgi-bin":

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #!/usr/bin/python3
    # -*- coding: utf-8 -*
     
    import cgi 
    from math import *
    import numpy as np
     
    # ajoute un module de calcul supplémentaires
    from calculsup import *
     
    # initialise le CGI (les 2 print sont nécessaires!)
    form = cgi.FieldStorage()
    print("Content-type: text/html; charset=UTF-8")
    print()
     
    # récupére l'expression demandée (None la 1ère fois)
    expression = form.getvalue("expression")
     
    # calcul de l'expression
    if expression is None:
        valeur = None
    else:    
        try:
            valeur = str(eval(expression))
        except Exception as msgerr:
            valeur = "Erreur: " + msgerr.args[0] 
     
    # construit la page html pour renvoyer le résultat et préparer la question suivante
    html = """<!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title>Mini-calculatrice</title>
    </head>
    <body style="font-family:monospace;">
        <p>expression: {}</p>
        <p>valeur: {}</p>
        <form action="/cgi-bin/calcul.py" method="post">
            <input type="text" name="expression" value="" size="50px" style="font-family:monospace;"/>
            <input type="submit" name="send" value="Calculer">
        </form> 
    </body>
    </html>
    """.format(expression, valeur)
     
    # renvoie le résultat au navigateur demandeur
    print(html)
    Vous voyez le principe: le navigateur de l'utilisateur n'étant capable que d'afficher du "html", le programme Python appelé, en plus de faire les calculs demandés, devra "fabriquer" du html pour communiquer avec lui!

    Vous voyez aussi que ce script importe une page "calculsup.py" comportant des fonctions additionnelles. Pour l'exemple, j'y ai placé une fonction rare dans une calculatrice: la décomposition d'un nombre entier en facteurs premiers par la méthode des divisions:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    from math import sqrt
     
    ###############################################################################
    def facteurs(n):
        """Décomposition d'un nombre entier n>=0 en facteurs premiers
           par la méthode des divisions
        """
        if n<=1:
            return [] # NB: 1 n'est pas un nombre 1er
     
        F = []
        # recherche de tous les facteurs 2 s'il y en a
        while n>=2:
            x, r = divmod(n, 2)
            if r!=0:
                break # il n'y a pas ou plus de facteur 2
            F.append(2)
            n = x
     
        # recherche des facteurs 1er >2
        i=3
        racn = int(sqrt(n))+1 # limite pour la recherche de facteurs
        while i<=n:
            if i>racn:
                F.append(n) # dernier facteur trouvé
                break
            x, r = divmod(n, i)
            if r==0:
                F.append(i) # nouveau facteur trouvé
                n = x
                racn = int(sqrt(n))+1 # nouvelle limite
            else:
                i += 2 # nombre impair suivant
        return F
    Voilà, on a fini! Utilisons maintenant:

    on relance notre serveur pour lui faire apprendre toute la config. Et on appelle dans notre navigateur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    localhost:8888/cgi-bin/calcul.py
    Il doit s'afficher:

    expression: None

    valeur: None
    suivi d'une ligne de saisie et d'un bouton "Calculer". Le None est normal puisqu'on n'a pas encore demandé de calcul.

    On tape maintenant dans la ligne de saisie, puis un clic sur le bouton "Calculer" et il s'affiche le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    2+3 => 5
    2**32 => 4294967296
    sin(0.5) => 0.479425538604203
    sqrt(2.0) => 1.4142135623730951
    factorial(100) => 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
    np.pi => 3.141592653589793
    facteurs(1234567891234567890) => [2, 3, 3, 5, 7, 11, 13, 19, 3607, 3803, 52579]
    etc...
    Bien sûr, comme c'est un serveur web, il n'y a pas de mémoire entre 2 expressions à calculer.

    Dernier point: on utilise ici la fonction "eval" pour calculer les expressions. C'est une fonction dangereuse si le serveur est accessible au public, mais ce n'est pas ce qu'on a voulu faire ici.

    Si vous voulez que cette calculatrice soit toujours disponible, rien ne vous empêche de lancer le serveur automatiquement à l'allumage de votre PC! Il faudrait fabriquer un petit script console (fichier .bat sous Windows), et le faire lancer par l'OS.

    Bon amusement!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 872
    Points : 3 716
    Points
    3 716
    Par défaut
    Salut merci,

    J'ai testé un code similaire mais seuls les fichiers .py fonctionnent, la page index.html n'est pas renvoyée par le serveur...

    EDIT :
    Citation Envoyé par tyrtamos Voir le message

    Vous prenez ensuite votre navigateur préféré (pour moi, c'est Firefox), et vous appelez:

    Cela fonctionne mais chez moi il faut indiquer le dossier "public" : http://localhost:8888/public ou http://localhost:8888/public/index.html

    Mais cela ne fonctionne que pour la page index.html, j'ai mis un autre page p1.html dans le dossier "public" mais quand je fais : http://localhost:8888/public/p1.html cela me revoit la page index.html...

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Désolé pour le délai de réponse.

    Les problèmes que tu cites suggèrent que ton serveur n'a pas été lancé dans le répertoire courant "public" mais dans le répertoire au dessus qui contient "serveur.py".
    Je rappelle mon texte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Pour le lancer, on affiche une console (cmd.exe sous Windows), on se place dans le répertoire "public", et on lance le serveur:
    ../serveur.py
    Cela veut dire qu'en console, on utilise la bonne commande (cd sous Windows) pour se mettre dans le répertoire "public" qui sera, après, la racine du serveur.
    En faisant comme ça:
    - l'appel à "localhost:8800" dans un navigateur lance bien la page "index.html" comme c'est normal pour un serveur (le fichier "index.html" est appelé par défaut).
    - l'appel à un autre fichier html comme "toto.html" sera affiché avec "localhost:8800/toto.html"
    - l'appel à un fichier python "calcul.py" par exemple, sera lancé par: "localhost:8800/cgi-bin/calcul.py" qui retournera une page html avec une zone de saisie pour l'expression à calculer.

    D'ailleurs, faire que le code du serveur "serveur.py" se trouve dans le répertoire "public", c'est à dire accessible à une requête client, ne serait pas normal.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 872
    Points : 3 716
    Points
    3 716
    Par défaut
    Salut et merci,

    Citation Envoyé par tyrtamos Voir le message
    Les problèmes que tu cites suggèrent que ton serveur n'a pas été lancé dans le répertoire courant "public" mais dans le répertoire au dessus qui contient "serveur.py".
    Je rappelle mon texte:
    Oui effectivement c'était bien ça le problème...

    Citation Envoyé par tyrtamos Voir le message
    D'ailleurs, faire que le code du serveur "serveur.py" se trouve dans le répertoire "public", c'est à dire accessible à une requête client, ne serait pas normal.
    Effectivement merci de l'avoir rappelé...

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/04/2009, 10h25
  2. serveur web fonctionne mais inaccessible sur internet
    Par RichardP dans le forum Apache
    Réponses: 68
    Dernier message: 12/12/2008, 10h14
  3. serveur WEB,FTP,MAIL sur meme machine C raisonnable ?
    Par littleman dans le forum Serveurs (Apache, IIS,...)
    Réponses: 5
    Dernier message: 07/07/2004, 00h01
  4. CORBA sur serveur web en local
    Par barberot dans le forum CORBA
    Réponses: 8
    Dernier message: 31/03/2004, 09h28
  5. Exploitation de base sur un serveur Web
    Par Oz-WereWolf dans le forum Installation
    Réponses: 10
    Dernier message: 07/03/2004, 23h52

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