Serveur Web - cgi_directories ne fonctionne pas comme attendu [Résolu]

Serveur Web - cgi_directories ne fonctionne pas comme attendu [Résolu] - Python - Programmation

Marsh Posté le 04-03-2015 à 07:11:39    

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 :
  1. # -*-coding:Latin-1 -*
  2. import http.server
  3. import threading
  4. import webbrowser
  5. import sys
  6. #import time
  7. ########################################################################     
  8. class monServeur():
  9.     """Serveur web tout simple.
  10.    
  11.     Parametres constructeur
  12.     -----------------------
  13.     - ip : adresse ip qui sera bind ("" par défaut, soit toutes les interfaces)   
  14.     - port : port qui sera ouvert (80 par défaut)
  15.    
  16.     """
  17.     #----------------------------------------------------------------------
  18.     def __init__(self, ip = "", port = 80):
  19.         """Constructeur"""
  20.         #threading.Thread.__init__(self) # Mauvaise méthode car impossible de relancer après arrêt
  21.         self.message("Serveur web" )
  22.         self.ip = ip
  23.         self.port = port
  24.         self.message("Ip (si blanc alors tous) :", self.ip)
  25.         self.message("Port :", self.port)   
  26.         self.adresse = (ip, port)
  27.         self.handler = http.server.CGIHTTPRequestHandler
  28.         self.handler.cgi_directories = ['/']
  29.         print(self.handler.cgi_directories)
  30.         self.enEcoute = False
  31.         # self.shutdownServeur = threading.Event() # Ecoute conditionnée
  32.        
  33.     def start(self):  # bonne méthode
  34.         self.thread = threading.Thread(target=self.run)
  35.         self.thread.start()
  36.        
  37.     def run(self):
  38.         if not self.enEcoute:
  39.             self.enEcoute = True
  40.             self.message("> Ecoute sur {}:{}...".format(self.ip, self.port)) 
  41.             # self.shutdownServeur.clear() # Ecoute conditionnée
  42.             # while not self.shutdownServeur.isSet(): # Ecoute conditionnée
  43.                 #self.httpd.handle_request()
  44.             server = http.server.HTTPServer 
  45.             self.httpd = server(self.adresse, self.handler)
  46.             self.httpd.serve_forever() # Ecoute permanente
  47.             self.message("> Arrêt de l'écoute du port", self.port)
  48.         else:
  49.             self.message("> Le serveur est déjà en écoute..." )
  50.     def stop(self, timeout = 3):
  51.         if self.enEcoute:
  52.             self.enEcoute = False
  53.             self.message("> Arret du serveur..." ) 
  54.             # self.shutdownServeur.set() # Ecoute conditionnée
  55.             self.httpd.shutdown() # Ecoute permanente
  56.             self.httpd.socket.close()
  57.             self.message("> Fermeture" )
  58.             self.thread.join(timeout)  #None pour illimité
  59.         else:
  60.             self.message("> Le serveur est déjà à l'arrêt..." )
  61.            
  62.     def test(self):
  63.         if self.enEcoute:           
  64.             if self.ip != "":
  65.                 ip =  self.ip
  66.             else:
  67.                 ip = "127.0.0.1"
  68.             webbrowser.open('http://{}:{}'.format(ip, self.port))
  69.         else:
  70.             self.message("> Le serveur n'est pas à l'écoute..." )
  71.            
  72.     def status(self):
  73.         if self.enEcoute:           
  74.             self.message("> Status : Le serveur est pas à l'écoute." )
  75.         else:
  76.             self.message("> Status : Le serveur n'est pas à l'écoute." )                   
  77.        
  78.     def message(self, *parametres):
  79.         print("Serveur WEB#", *parametres)       
  80. serveur = monServeur(port = 10001)
  81. def aide():
  82.     print("-> start : Démarre le serveur" )
  83.     print("-> stop : Arrête le serveur" )
  84.     print("-> status : Retourne l'état d'écoute du serveur" )
  85.     print("-> test: Ouvre un navigateur" )   
  86.     print("-> quit : Quitte l'application" )
  87.     print("-> help : Affiche ce menu" )
  88. serveurMenu = {
  89.     'start': serveur.start,
  90.     'stop': serveur.stop,
  91.     'test': serveur.test,
  92.     'status': serveur.status,   
  93.     'help': aide,
  94. }
  95. saisie = ""
  96. while saisie != 'quit':
  97.     saisie = input("Que voulez-vous faire (help pour l'aide) ? " ).lower()
  98.     try:
  99.         choix = serveurMenu[saisie]
  100.     except KeyError:
  101.         pass   
  102.     else:
  103.         choix()
  104. serveur.stop()


Message édité par Slide le 04-03-2015 à 08:29:59
Reply

Marsh Posté le 04-03-2015 à 07:11:39   

Reply

Marsh Posté le 04-03-2015 à 08:21:00    

En faite ca marche, fallait juste que je précise
http://127.0.0.1:10001/index.py
et non
http://127.0.0.1:10001/
 
Je laisse le code si ca peut aider quelqu'un ;).

Reply

Marsh Posté le 04-03-2015 à 11:43:15    

Ca ma fatigué alors j'ai contourné les limitations afin de résoudre mon propre problème à la base et aussi lire les index.py quand aucun fichier n'est passé.
 
remplacer  
self.handler = http.server.CGIHTTPRequestHandler
par
self.handler = http.server.CGIHTTPRequestHandlerPY
 

Code :
  1. class CGIHTTPRequestHandlerPY(http.server.CGIHTTPRequestHandler):
  2.     def is_cgi(self):
  3.         collapsed_path = http.server._url_collapse_path(urllib.parse.unquote(self.path))
  4.         dir_sep = collapsed_path.find('/', 1)
  5.         head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:]
  6.         self.cgi_info = head, tail
  7.         return True
  8.    
  9.     def send_head(self):
  10.         path = self.translate_path(self.path)
  11.         f = None
  12.         if os.path.isdir(path):
  13.             for file in "index.py", :       
  14.                 path = os.path.join(path, file)           
  15.                 if os.path.exists(path):
  16.                     if not self.path.rstrip().endswith('/'):
  17.                         self.path += '/'                   
  18.                     self.path += file
  19.                     break
  20.         if os.path.exists(path):
  21.             base, ext = posixpath.splitext(path)
  22.             for fileExt in ".py", :       
  23.                 if fileExt == ext:
  24.                     return http.server.CGIHTTPRequestHandler.send_head(self)           
  25.         return http.server.SimpleHTTPRequestHandler.send_head(self)


 
Bonus :
#Set root directory
os.chdir("./www" )

Reply

Marsh Posté le 05-03-2015 à 07:12:29    

http://image.noelshack.com/fichiers/2015/10/1425536518-classes.png
 
Code complet corrigé :
 

Code :
  1. # -*-coding:Latin-1 -*
  2. import http.server
  3. import threading
  4. import webbrowser
  5. import os
  6. import urllib.parse
  7. #Set root directory
  8. os.chdir("./www" )
  9. class CGIHTTPRequestHandlerPY(http.server.CGIHTTPRequestHandler):
  10.     def is_cgi(self):
  11.         collapsed_path = http.server._url_collapse_path(urllib.parse.unquote(self.path))
  12.         dir_sep = collapsed_path.find('/', 1)
  13.         self.cgi_info = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:]
  14.         return True
  15.    
  16.     def send_head(self):
  17.         path = self.ajouterIndexPY()
  18.         if os.path.exists(path):
  19.             if self.is_python(path):
  20.                 return http.server.CGIHTTPRequestHandler.send_head(self)
  21.         return http.server.SimpleHTTPRequestHandler.send_head(self)
  22.    
  23.     def do_POST(self):
  24.         self.ajouterIndexPY()
  25.         http.server.CGIHTTPRequestHandler.do_POST(self) 
  26.     def ajouterIndexPY(self):
  27.         path = self.translate_path(self.path)
  28.         if os.path.isdir(path):
  29.             for file in "index.py", :       
  30.                 path = os.path.join(path, file)           
  31.                 if os.path.exists(path):
  32.                     if not self.path.rstrip().endswith('/'):
  33.                         self.path += '/'                   
  34.                     self.path += file
  35.                     break
  36.         return path
  37. ########################################################################     
  38. class monServeur():
  39.     """Serveur web tout simple.
  40.    
  41.     Parametres constructeur
  42.     -----------------------
  43.     - ip : adresse ip qui sera bind ("" par défaut, soit toutes les interfaces)   
  44.     - port : port qui sera ouvert (80 par défaut)
  45.    
  46.     """
  47.     #----------------------------------------------------------------------
  48.     def __init__(self, ip = "", port = 80):
  49.         """Constructeur"""
  50.         #threading.Thread.__init__(self) # Mauvaise méthode car impossible de relancer après arrêt
  51.         self.message("Serveur web" )
  52.         self.ip = ip
  53.         self.port = port
  54.         self.message("Ip (si blanc alors tous) :", self.ip)
  55.         self.message("Port :", self.port) 
  56.         self.adresse = (ip, port)
  57.         self.handler = CGIHTTPRequestHandlerPY
  58.         self.enEcoute = False
  59.         # self.shutdownServeur = threading.Event() # Ecoute conditionnée
  60.        
  61.     def start(self):  # bonne méthode
  62.         self.thread = threading.Thread(target=self.run)
  63.         self.thread.start()
  64.        
  65.     def run(self):
  66.         if not self.enEcoute:
  67.             self.enEcoute = True
  68.             self.message("> Ecoute sur {}:{}...".format(self.ip, self.port)) 
  69.             # self.shutdownServeur.clear() # Ecoute conditionnée
  70.             # while not self.shutdownServeur.isSet(): # Ecoute conditionnée
  71.                 #self.httpd.handle_request()
  72.             server = http.server.HTTPServer 
  73.             self.httpd = server(self.adresse, self.handler)
  74.             self.httpd.serve_forever() # Ecoute permanente
  75.             self.message("> Arrêt de l'écoute du port", self.port)
  76.         else:
  77.             self.message("> Le serveur est déjà en écoute..." )
  78.     def stop(self, timeout = 3):
  79.         if self.enEcoute:
  80.             self.enEcoute = False
  81.             self.message("> Arret du serveur..." ) 
  82.             # self.shutdownServeur.set() # Ecoute conditionnée
  83.             self.httpd.shutdown() # Ecoute permanente
  84.             self.httpd.socket.close()
  85.             self.message("> Fermeture" )
  86.             self.thread.join(timeout)  #None pour illimité
  87.         else:
  88.             self.message("> Le serveur est déjà à l'arrêt..." )
  89.            
  90.     def test(self):
  91.         if self.enEcoute:           
  92.             if self.ip != "":
  93.                 ip =  self.ip
  94.             else:
  95.                 ip = "127.0.0.1"
  96.             webbrowser.open('http://{}:{}/'.format(ip, self.port))
  97.         else:
  98.             self.message("> Le serveur n'est pas à l'écoute..." )
  99.            
  100.     def status(self):
  101.         if self.enEcoute:           
  102.             self.message("> Status : Le serveur est pas à l'écoute." )
  103.         else:
  104.             self.message("> Status : Le serveur n'est pas à l'écoute." )                   
  105.        
  106.     def message(self, *parametres):
  107.         print("Serveur WEB#", *parametres)       
  108. serveur = monServeur(port = 10001)
  109. def aide():
  110.     print("-> start : Démarre le serveur" )
  111.     print("-> stop : Arrête le serveur" )
  112.     print("-> status : Retourne l'état d'écoute du serveur" )
  113.     print("-> test: Ouvre un navigateur" )   
  114.     print("-> quit : Quitte l'application" )
  115.     print("-> help : Affiche ce menu" )
  116. serveurMenu = {
  117.     'start': serveur.start,
  118.     'stop': serveur.stop,
  119.     'test': serveur.test,
  120.     'status': serveur.status,   
  121.     'help': aide,
  122. }
  123. serveur.start()
  124. saisie = ""
  125. while saisie != 'quit':
  126.     saisie = input("Que voulez-vous faire (help pour l'aide) ? " ).lower()
  127.     try:
  128.         choix = serveurMenu[saisie]
  129.     except KeyError:
  130.         pass   
  131.     else:
  132.         choix()
  133. serveur.stop()


Message édité par Slide le 05-03-2015 à 07:22:50
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed