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.