start servidor script modulenotfounderror httpsimpleserver dev create python basehttpserver

servidor - Python 3.x BaseHTTPServer o http.server



python start server script (3)

El que hizo la documentación de python 3 para http.server no notó el cambio. La documentación 2.7 indica directamente en la parte superior "Nota El módulo BaseHTTPServer se ha fusionado en http.server en Python 3. La herramienta 2to3 adaptará automáticamente las importaciones al convertir sus fuentes a Python 3."

Estoy tratando de hacer un programa BaseHTTPServer. Prefiero usar Python 3.3 o 3.2 para eso. Encuentro que el documento es difícil de entender con respecto a qué importar, pero intenté cambiar la importación desde:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

a:

from http.server import BaseHTTPRequestHandler,HTTPServer

y luego la importación funciona y el programa comienza y espera una solicitud GET. PERO cuando llega la solicitud, se genera una excepción:

File "C:/Python33/lib/socket.py", line 317, in write return self._sock.send(b) TypeError: ''str'' does not support the buffer interface

Pregunta: ¿Hay una versión de BaseHTTPServer o http.server que funcione de la caja con Python3.x o estoy haciendo algo mal?

Este es "mi" programa que intento ejecutar en Python 3.3 y 3.2:

#!/usr/bin/python # from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer from http.server import BaseHTTPRequestHandler,HTTPServer PORT_NUMBER = 8080 # This class will handle any incoming request from # a browser class myHandler(BaseHTTPRequestHandler): # Handler for the GET requests def do_GET(self): print (''Get request received'') self.send_response(200) self.send_header(''Content-type'',''text/html'') self.end_headers() # Send the html message self.wfile.write("Hello World !") return try: # Create a web server and define the handler to manage the # incoming request server = HTTPServer(('''', PORT_NUMBER), myHandler) print (''Started httpserver on port '' , PORT_NUMBER) # Wait forever for incoming http requests server.serve_forever() except KeyboardInterrupt: print (''^C received, shutting down the web server'') server.socket.close()

El programa funciona parcialmente en Python2.7 pero da esta excepción después de 2-8 solicitudes:

error: [Errno 10054] An existing connection was forcibly closed by the remote host


Solo puedes hacer eso:

self.send_header(''Content-type'',''text/html''.encode()) self.end_headers() # Send the html message self.wfile.write("Hello World !".encode())


Su programa en python 3.xx funciona de inmediato, excepto por un problema menor. El problema no está en su código sino en el lugar donde está escribiendo estas líneas:

self.wfile.write("Hello World !")

Está intentando escribir "cadena" allí, pero los bytes deberían ir allí. Entonces necesitas convertir tu cadena a bytes.

Aquí, mira mi código, que es casi lo mismo que tú y funciona perfectamente. Está escrito en python 3.4

from http.server import BaseHTTPRequestHandler, HTTPServer import time hostName = "localhost" hostPort = 9000 class MyServer(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(bytes("<html><head><title>Title goes here.</title></head>", "utf-8")) self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8")) self.wfile.write(bytes("<p>You accessed path: %s</p>" % self.path, "utf-8")) self.wfile.write(bytes("</body></html>", "utf-8")) myServer = HTTPServer((hostName, hostPort), MyServer) print(time.asctime(), "Server Starts - %s:%s" % (hostName, hostPort)) try: myServer.serve_forever() except KeyboardInterrupt: pass myServer.server_close() print(time.asctime(), "Server Stops - %s:%s" % (hostName, hostPort))

Tenga en cuenta la forma en que los convierto de cadena a bytes utilizando la codificación "UTF-8". Una vez que haga este cambio en su programa, su programa debería funcionar bien.