Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
correr CGI http.server CGIHTTPRequestHandler
#1
hola,

estoy haciendo unas pruebas para incluir un mini-servidor web con el modulo http.server y necesito usar el cgi-bin.

el servidor arranca y funciona, y me ve el fichero .py pero me muestra el codigo fuente como texto plano. En la documnetacion oficial dicen que por defecto el metodo CGIHTTPRequestHandler usa los directorios /cgi-bin y, creo recordar, el /htbin.

yo lo he redirigido a uno llamado web (creo que lo he hecho bien, pero... Angel )

Se me olvidaba decir que estoy en windows.

He revisado el tema y no me parece ver nada raro. La versión que uso es Python 3.6.1 para wundows. Instalación estandar.

A ver si alguien me puede iluminar.

La estructura de directorio es la siguiente:

d:\
\pruebas\
       \servidor.py
       \web dir.
             favicon.ico
             index.html
             script_cgi.py

a continuación pongo los codigos y las salidas que muestran:

codigo servidor.py:


Código:
import os

try:
   # python 2
   from SimpleHTTPServer import SimpleHTTPRequestHandler
   from BaseHTTPServer import HTTPServer as BaseHTTPServer
except ImportError:
   # python 3
   from http.server import HTTPServer as BaseHTTPServer, SimpleHTTPRequestHandler, CGIHTTPRequestHandler


class HTTPHandler(CGIHTTPRequestHandler):
   def translate_path(self, path):
       path = CGIHTTPRequestHandler.translate_path(self, path)
       relpath = os.path.relpath(path, os.getcwd())
       fullpath = os.path.join(self.server.base_path, relpath)
       return fullpath


class HTTPServer1(BaseHTTPServer):
   def __init__(self, base_path, server_address, RequestHandlerClass=HTTPHandler):
       self.base_path = base_path
       BaseHTTPServer.__init__(self, server_address, RequestHandlerClass)
       
       
if __name__ == '__main__':
   web_dir = os.path.join(os.path.dirname(__file__), 'web')
   httpd = HTTPServer1(web_dir, ("", 8080))
   httpd.serve_forever()

La respuesta que me da el servidor es 200 (correcta), tanto con el html como con cgi .py

el codigo html es un formulario que manda los datos con el metodo GET


Código:
<!DOCTYPE html>
<html>
<head>
   <title>una prueba</title>
</head>
<body>
   <div style="text-align:center;">
       <h1>Usuario login</h1>
       <form action="script_cgi.py" method="get">
           usuario  :  <input type="text" name="usuario" style="text-align:center;">
           <br><br>
           password   :  <input type="password" name="contrasenia" style="text-align:center;">
           <br><br><br>
           <input type="submit" value="Submit">
       </form>
   </div>
</body>
</html>


los datos los envia bien ya que en la barra de direcciones se muestran los datos:


Código:
http://localhost:8080/script_cgi.py?usuario=zzz&contrasenia=xxx


el script cgi es el siguiente:


Código:
#!"C:\Python361\python.exe -u"

import cgi, cgitb
cgitb.enable()          ## para depurar posibles errores en el navegador

form = cgi.FieldStorage()

## obtengo los datos del formulario
first = form.getvalue('usuario')
last = form.getvalue('contrasenia')

print("Content-type: text/html")
print('')
if 'usuario' not in form or 'contrasenia' not in form:
   print("""
   <html>
       <head></head>
       <body>
       <b> no hay username </b>
       </body>
   </html>
   """)
else:
   print("<html>")
   print("<head><title>Datos introducidos</title></head>")
   print("<body>")
   print("<div>")
   print("<h1>usuario y contrasenia</h1>")
   print("<b>Nombre : </b>" + first + "<br>")
   print("<br><b>Apellidos : </b>" + last + "<br>")
   print("")
   print("</div>")
   print("</body>")
   print("</html>")
Responder
#2
solucionado.

despues de varias horas leyendo código, he llegado a las siguientes conclusiones

la clase madre de CGIHTTPRequestHandler tiene una variable llamada cgi_directories que es una tupla, de tal manera que cgi_directotries[0] es '/cgi-bin'  y el segundo elemento es '/htbin'.

lo que he hecho es sustituir el segundo elemento así: self.cgi_directories[1] = '/web'

tambien hay que añadir 'web' al inicio de self.path

he readaptado el servidor así:


Código:
# python 3.6.1
from http.server import HTTPServer, CGIHTTPRequestHandler, _url_collapse_path

class MyCGIHTTPServer(CGIHTTPRequestHandler):  
 def is_cgi(self):
   self.path = 'web' + self.path
   collapsed_path = _url_collapse_path(self.path)
   
   print('7----->', collapsed_path, '----->', self.path)
   print('10 --> dir_1 -->', self.cgi_directories[0], 'dir 2 -->', self.cgi_directories[1])
   # cambio el /htbin por /web
   self.cgi_directories[1] = '/web'
   for path in self.cgi_directories:
       print('11 ----->', path)
       if path in collapsed_path:
           print('tenemos /web en los dirs. cgi autorizados')
           dir_sep_index = collapsed_path.rfind(path) + len(path)
           head, tail = collapsed_path[:dir_sep_index], collapsed_path[dir_sep_index + 1:]
           self.cgi_info = head, tail
           return True
   return False

server = HTTPServer
handler = MyCGIHTTPServer

server_address = ("", 8080)
#handler.cgi_directories = ["./web"]

httpd = server(server_address, handler)
httpd.serve_forever()
Código:
ahora solo me queda "clasear" y montar todo esto sobre un hilo y añadirle los metodos de arranque y parada :

server.shutdown()
server.server_close()

ahora solo me queda "clasear" todo esto y añadirle los metodos de arranque y para
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)