개발/Python

Python3의 BaseHTTPServer 또는 http.server

MinorMan 2021. 4. 21. 07:11
반응형

<질문>

BaseHTTPServer 프로그램을 만들려고합니다. 저는 Python 3.3 또는 3.2를 선호합니다. 가져올 내용과 관련하여 문서를 이해하기 어렵지만 가져 오기를 다음에서 변경해 보았습니다.

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>

Python 3.xx의 프로그램은 하나의 사소한 문제를 제외하고는 즉시 작동합니다. 문제는 코드가 아니라 다음 줄을 작성하는 위치입니다.

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

거기에 "문자열"을 쓰려고하지만 바이트가 거기에 있어야합니다. 따라서 문자열을 바이트로 변환해야합니다.

여기, 당신과 거의 동일하고 완벽하게 작동하는 내 코드를 참조하십시오. 파이썬 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("Title goes here.", "utf-8"))
        self.wfile.write(bytes("This is a test.", "utf-8"))
        self.wfile.write(bytes("You accessed path: %s" % self.path, "utf-8"))
        self.wfile.write(bytes("", "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"인코딩을 사용하여 문자열에서 바이트로 변환하는 방법에 유의하십시오. 프로그램에서이 변경을 수행하면 프로그램이 제대로 작동합니다.


<답변2>

다음과 같이 할 수 있습니다.

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

<답변3>

http.server에 대한 Python 3 문서를 작성한 사람은 변경 사항을 기록하지 못했습니다. 2.7 문서는 맨 위에 "참고 : BaseHTTPServer 모듈은 Python 3에서 http.server에 병합되었습니다. 2to3 도구는 소스를 Python 3으로 변환 할 때 자동으로 가져 오기를 조정합니다."


<답변4>

파이썬 3에서는 객체와 같은 바이트를 받아들이 기 때문에 wfile 인수를 변경해야합니다. 따라서 다음과 같이 문자열을 바이트로 변환합니다.

self.wfile.write(b"<h1> Hello </h1>")

Or

self.wfile.write( bytes("<h1> Hello </h1>) )
반응형