2014-04-24 7 views
34

BaseHTTPServer 프로그램을 만들려고합니다. 필자는 Python 3.3 또는 3.2를 선호합니다. 나는 가져올 무엇인지에 대해 이해하기 어려운 문서를 찾을에서 가져 오기를 변경 시도 :Python 3.x BaseHTTPServer 또는 http.server

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer 

에 :

from http.server import BaseHTTPRequestHandler,HTTPServer 

을 한 후 가져 오기 작품과 프로그램을 시작하고 GET 요청을 기다리고 있습니다. 요청이 도착할 때하지만 예외가 발생합니다 :

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

질문 : Python3.x와 상자 밖으로 작동하거나 내가 뭔가 잘못하고있는 중이 야 그 BaseHTTPServer의 버전이 아니면 http.server?

이다 나는 파이썬 3.3과 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() 

프로그램 작업을 부분적으로 Python2.7에 있지만 2-8 요청 후이 예외를 제공합니다

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

답변

1

누구든지 http.server에 대한 python 3 설명서에서 변경 사항을 기록하지 못했습니다. 2.7 설명서는 맨 위에 표시됩니다. "참고 BaseHTTPServer 모듈은 Python 3의 http.server에 병합되었습니다. 2to3 도구는 소스를 Python 3으로 변환 할 때 자동으로 가져 오기를 적용합니다."

+1

슬프게도, 파이썬 3 문서의 규범 나는 이것이 큰 실수라고 생각 파이썬 2. 변경 사항을주의하는 것이 아니다. –

43

python 3.xx의 프로그램은 사소한 문제를 제외하고는 즉시 사용할 수 있습니다. 문제는 코드에서가 아니라 당신이이 라인을 작성하는 장소 :

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

당신은 거기에 "문자열을"쓰기를 시도하고 있지만 바이트가 가야한다. 따라서 문자열을 바이트로 변환해야합니다.

여기 내 코드는 나와 거의 동일하며 완벽하게 작동합니다. 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)) 

"UTF-8"인코딩을 사용하여 문자열을 바이트로 변환하는 방법에 유의하십시오. 프로그램에서이 변경을 수행하면 프로그램이 제대로 작동합니다.

+0

나를 위해 완벽하게 일했습니다. 감사합니다. – DenisFLASH

4

당신은 그렇게 할 수 있습니다

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