Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
mini_calculatrice_cgi [2008/04/07 09:38] tyrtamos |
mini_calculatrice_cgi [2008/04/12 08:51] tyrtamos |
||
---|---|---|---|
Ligne 63: | Ligne 63: | ||
A titre d' | A titre d' | ||
- | Cependant, si vous avez un hébergeur de site web qui accepte les scripts CGI Python, vous pourriez le mettre sur ce site, et donc en libre service pour tout le web! | + | Vous l' |
+ | |||
+ | Sous linux, il y a 2 particularités: | ||
+ | |||
+ | * le code doit avoir des fins de ligne de type " | ||
+ | |||
+ | * le fichier calculcgi.py doit être exécutable. | ||
+ | |||
+ | Si vous avez un hébergeur de site web qui accepte les scripts CGI Python, vous pourriez le mettre sur ce site, et donc en libre service pour tout le web! | ||
Quelques particularités de cette calculatrice CGI: | Quelques particularités de cette calculatrice CGI: | ||
Ligne 77: | Ligne 85: | ||
* cette calculatrice est facile à étendre par des modules supplémentaires, | * cette calculatrice est facile à étendre par des modules supplémentaires, | ||
+ | Vous n'avez pas beaucoup d' | ||
+ | |||
+ | * l' | ||
+ | |||
+ | * le temps maxi de calcul en secondes au delà duquel la calculatrice s' | ||
+ | |||
+ | Le code est copieusement auto-documenté: | ||
+ | |||
+ | <code python> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | # importation nécessaire pour les divisions entières aient un résultat décimal | ||
+ | from __future__ import division | ||
+ | |||
+ | # indispensable pour l' | ||
+ | print " | ||
+ | # pour Linux: il faut que les fins de ligne de cette page soient " | ||
+ | |||
+ | # importations " | ||
+ | import cgi | ||
+ | from sys import path, exc_info, settrace | ||
+ | import threading | ||
+ | import time | ||
+ | |||
+ | # importations seulement nécessaires aux calculs | ||
+ | from math import * | ||
+ | |||
+ | # importations optionnelles de modules de calcul supplémentaires | ||
+ | path.append(' | ||
+ | from calculsup import * | ||
+ | |||
+ | ############################################################################## | ||
+ | # déclaration des variables globales | ||
+ | |||
+ | # Nécessaire pour limiter la longueur des calculs (ici, 10 secondes) | ||
+ | dureemaxcalcul=10 | ||
+ | |||
+ | # adresse de la calculatrice à adapter à votre contexte | ||
+ | adresse=" | ||
+ | |||
+ | # partie html pour présentation des résultats dans un navigateur web | ||
+ | codehtml1 = """ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | <meta name=" | ||
+ | <meta name=" | ||
+ | <meta http-equiv=" | ||
+ | <meta name=" | ||
+ | <meta name=" | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | <form name=" | ||
+ | """ | ||
+ | |||
+ | codehtml2 = """ | ||
+ | "> | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | """ | ||
+ | |||
+ | codehtml3 = """ | ||
+ | </p> | ||
+ | < | ||
+ | """ | ||
+ | |||
+ | codehtml4 = """ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | """ | ||
+ | |||
+ | ############################################################################## | ||
+ | # Définition de la classe " | ||
+ | # | ||
+ | class Calcul(threading.Thread): | ||
+ | """ | ||
+ | |||
+ | def __init__(self, | ||
+ | """ | ||
+ | threading.Thread.__init__(self) | ||
+ | # stocke l' | ||
+ | self.expression = expr | ||
+ | # créé la variable d' | ||
+ | self.arretcalcul = False | ||
+ | # créé la variable d' | ||
+ | self.resultat = "" | ||
+ | |||
+ | def run(self): | ||
+ | """ | ||
+ | try: | ||
+ | # lance le traçage pour permettre l' | ||
+ | settrace(self.tracecalcul) | ||
+ | # calcul de l' | ||
+ | self.resultat = " | ||
+ | # arrêt du traçage | ||
+ | settrace(None) | ||
+ | except: | ||
+ | # arrêt du traçage en cas d' | ||
+ | settrace(None) | ||
+ | # enregistrement de l' | ||
+ | self.resultat = " | ||
+ | |||
+ | def tracecalcul(self, | ||
+ | """ | ||
+ | if event==' | ||
+ | if self.arretcalcul: | ||
+ | raise ValueError (" | ||
+ | return self.tracecalcul | ||
+ | |||
+ | def stopcalcul(self): | ||
+ | """ | ||
+ | self.arretcalcul = True | ||
+ | |||
+ | def donneresultat(self): | ||
+ | return self.resultat | ||
+ | |||
+ | ############################################################################## | ||
+ | # Traitement de la requête reçue par le réseau | ||
+ | # | ||
+ | if __name__ == " | ||
+ | # initialisation du temps de départ | ||
+ | debutcalcul=time.time() | ||
+ | # Récupération d'une éventuelle requête transmise (GET ou POST) | ||
+ | recup=cgi.FieldStorage() | ||
+ | if recup.has_key(" | ||
+ | # =il y a eu effectivement réception d'une requête (GET ou POST) | ||
+ | requete=recup[" | ||
+ | if requete=="": | ||
+ | # la requête reçue est vide: on renvoie la page web avec les zones vides | ||
+ | reponse="" | ||
+ | duree="" | ||
+ | else: | ||
+ | # on lance le calcul de la requête en tâche de fond (thread démon) | ||
+ | calc=Calcul(requete) | ||
+ | calc.setDaemon(True) | ||
+ | calc.start() | ||
+ | while calc.isAlive(): | ||
+ | # vérif qu'on ne dépasse pas le temps maxi de calcul | ||
+ | if (time.time()-debutcalcul)> | ||
+ | # si oui, on demande l' | ||
+ | calc.stopcalcul() | ||
+ | # tempo pour laisser la priorité au calcul | ||
+ | time.sleep(0.5) | ||
+ | # lecture du résultat du calcul ou de l' | ||
+ | reponse = calc.donneresultat() | ||
+ | else: | ||
+ | # si rien n'a été transmis, renvoie la page web avec les zones vides pour calcul suivant | ||
+ | requete="" | ||
+ | reponse="" | ||
+ | duree="" | ||
+ | # renvoie au client web la page html donnant le résultat du calcul ou le message d' | ||
+ | print codehtml1 + adresse + codehtml2 + requete + codehtml3 + reponse + codehtml4 | ||
+ | |||
+ | </ | ||
+ | |||
+ | Et pour le module de calcul supplémentaire calculsup.py: | ||
+ | |||
+ | <code python> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | # importation nécessaire pour les divisions entières aient un résultat décimal | ||
+ | from __future__ import division | ||
+ | |||
+ | ############################################################################### | ||
+ | # Factorielle de n | ||
+ | # - version volontairement non récursive (la pile de python est limitée à environ 1000) | ||
+ | def fact(n): | ||
+ | """ | ||
+ | # Vérification de la donnée | ||
+ | if not(type(n)==int or type(n)==long) or n<0: | ||
+ | raise ValueError (" | ||
+ | # Calcul | ||
+ | x=1 | ||
+ | for i in xrange(2, | ||
+ | x*=i | ||
+ | return x | ||
+ | </ | ||
+ | |||
+ | Amusez-vous bien! | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <style type=" | ||
+ | <!-- | ||
+ | body {background-image: | ||
+ | --> | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | </ | ||
+ | </ |