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:
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"):
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:
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:
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":
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:
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:
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:
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!
Partager