Slide | Bonjour,
Je suis actuellement en train de m'essayer au Python, je suis débutant dans ce langage, même si on peut dire que ce n'est plus trop le cas étant donné la tonne de documentation que j'ai dévoré.
Je rencontre cependant un problème, j'ai perdu plusieurs heures dessus hier avant de me coucher et pourtant je ne l'ai pas réglé.
Donc voilà, j'ai fait un serveur web tout simple en utilisant des Thread (pas de problème de ce coté là).
Le problème que je rencontre c'est avec self.handler.cgi_directories Ligne 31.
Quand j'essai de lui passer ['/'] il n’interprète plus aucun *.py quelque soit le répertoire.
Quand je commente la ligne, il interprète bien mes *.py mais uniquement dans le répertoire cgi-bin comme indiqué dans la documentation (il y en a un autre aussi dans la doc, enfin bref).
Mes questions :
- Comment faire pour que le serveur web interprète les fichiers *.py à la racine (self.handler.cgi_directories = ['/'] ne semble pas fonctionner, ligne 31) ?
- Comment faire pour empêcher le téléchargement du script "serveur" qui va se trouver à la racine à l’exécution ?
- Cela pose t'il un problème de sécurité de forcer l'interprétation à la racine ?
Merci pour votre aide,
Cordialement,
Slide
Python 3
Le code est complet, il fonctionnera immédiatement
Code :
- # -*-coding:Latin-1 -*
- import http.server
- import threading
- import webbrowser
- import sys
- #import time
- ########################################################################
- class monServeur():
- """Serveur web tout simple.
-
- Parametres constructeur
- -----------------------
- - ip : adresse ip qui sera bind ("" par défaut, soit toutes les interfaces)
- - port : port qui sera ouvert (80 par défaut)
-
- """
- #----------------------------------------------------------------------
- def __init__(self, ip = "", port = 80):
- """Constructeur"""
- #threading.Thread.__init__(self) # Mauvaise méthode car impossible de relancer après arrêt
- self.message("Serveur web" )
- self.ip = ip
- self.port = port
- self.message("Ip (si blanc alors tous) :", self.ip)
- self.message("Port :", self.port)
- self.adresse = (ip, port)
- self.handler = http.server.CGIHTTPRequestHandler
- self.handler.cgi_directories = ['/']
- print(self.handler.cgi_directories)
- self.enEcoute = False
- # self.shutdownServeur = threading.Event() # Ecoute conditionnée
-
- def start(self): # bonne méthode
- self.thread = threading.Thread(target=self.run)
- self.thread.start()
-
- def run(self):
- if not self.enEcoute:
- self.enEcoute = True
- self.message("> Ecoute sur {}:{}...".format(self.ip, self.port))
- # self.shutdownServeur.clear() # Ecoute conditionnée
- # while not self.shutdownServeur.isSet(): # Ecoute conditionnée
- #self.httpd.handle_request()
- server = http.server.HTTPServer
- self.httpd = server(self.adresse, self.handler)
- self.httpd.serve_forever() # Ecoute permanente
- self.message("> Arrêt de l'écoute du port", self.port)
- else:
- self.message("> Le serveur est déjà en écoute..." )
- def stop(self, timeout = 3):
- if self.enEcoute:
- self.enEcoute = False
- self.message("> Arret du serveur..." )
- # self.shutdownServeur.set() # Ecoute conditionnée
- self.httpd.shutdown() # Ecoute permanente
- self.httpd.socket.close()
- self.message("> Fermeture" )
- self.thread.join(timeout) #None pour illimité
- else:
- self.message("> Le serveur est déjà à l'arrêt..." )
-
- def test(self):
- if self.enEcoute:
- if self.ip != "":
- ip = self.ip
- else:
- ip = "127.0.0.1"
- webbrowser.open('http://{}:{}'.format(ip, self.port))
- else:
- self.message("> Le serveur n'est pas à l'écoute..." )
-
- def status(self):
- if self.enEcoute:
- self.message("> Status : Le serveur est pas à l'écoute." )
- else:
- self.message("> Status : Le serveur n'est pas à l'écoute." )
-
- def message(self, *parametres):
- print("Serveur WEB#", *parametres)
- serveur = monServeur(port = 10001)
- def aide():
- print("-> start : Démarre le serveur" )
- print("-> stop : Arrête le serveur" )
- print("-> status : Retourne l'état d'écoute du serveur" )
- print("-> test: Ouvre un navigateur" )
- print("-> quit : Quitte l'application" )
- print("-> help : Affiche ce menu" )
- serveurMenu = {
- 'start': serveur.start,
- 'stop': serveur.stop,
- 'test': serveur.test,
- 'status': serveur.status,
- 'help': aide,
- }
- saisie = ""
- while saisie != 'quit':
- saisie = input("Que voulez-vous faire (help pour l'aide) ? " ).lower()
- try:
- choix = serveurMenu[saisie]
- except KeyError:
- pass
- else:
- choix()
- serveur.stop()
|
Message édité par Slide le 04-03-2015 à 08:29:59
|