2014-04-24 8 views
34

Ich versuche, ein BaseHTTPServer-Programm zu machen. Ich bevorzuge Python 3.3 oder 3.2 dafür. Ich finde den doc schwer zu verstehen, über was zu importieren, sondern versuchte, aus dem Import zu ändern:Python 3.x BaseHTTPServer oder http.server

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer 

zu:

from http.server import BaseHTTPRequestHandler,HTTPServer 

und dann der Import funktioniert und das Programm starten und warten auf eine GET-Anfrage. ABER, wenn die Anforderung eine Ausnahme ankommt, wird angehoben:

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

Frage: Gibt es eine Version von BaseHTTPServer oder http.server, die mit Python3.x aus der Box arbeitet oder bin ich etwas falsch?

Das ist "mein" Programm, das ich in Python versuchen laufen 3.3 und 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() 

dem Programm arbeiten zum Teil in python2.7 sondern gibt diese Ausnahme nach 2-8 Anfragen:

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

Antwort

1

Wer auch immer die Dokumentation von Python 3 für http.server gemacht hat, konnte die Änderung nicht feststellen. Die 2.7 Dokumentation steht ganz oben. "Das BaseHTTPServer-Modul wurde in Python 3 mit http.server zusammengeführt. Das 2to3-Tool passt Importe automatisch an, wenn es Ihre Quellen nach Python 3 konvertiert."

+1

Leider die Norm auf dem Python 3 docs nicht Änderungen von Python zu beachten ist, 2. Ich denke, dass dies ein großer Fehler war. –

43

Ihr Programm in Python 3.xx funktioniert sofort - abgesehen von einem kleinen Problem. Das Problem ist nicht in Ihrem Code aber der Ort, wo Sie diese Zeilen zu schreiben:

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

Sie versuchen, „string“ in dort zu schreiben, aber Bytes sollte es gehen. Sie müssen also Ihre Zeichenfolge in Bytes konvertieren.

Hier sehen Sie meinen Code, der fast wie Sie ist und perfekt funktioniert. Sein in Python geschrieben 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)) 

Bitte beachten Sie, so wie ich sie aus Zeichenfolge zu konvertieren Bytes die „UTF-8“ Codierung. Sobald Sie diese Änderung in Ihrem Programm vornehmen, sollte Ihr Programm gut funktionieren.

+0

funktionierte perfekt für mich, danke! – DenisFLASH

4

Sie können einfach so tun:

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