我正在构建一个使用http.server
处理HTTP GET请求的类,这是我到目前为止编写的:
class webServerHandler(BaseHTTPRequestHandler):
__HOST = "localhost"
__PORT = 8080
# Custom GET response
def do_GET(self):
page_content = self.htmlHandler()
self.wfile.write(page_content) # Send web page
# HTML code
def htmlHandler(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
msg = '''
<html><head><title>Test</title></head>
<body><h1><center>Test</center></h1></body>
</html>
'''
return bytes(msg, "UTF-8") # UTF-8 Format
# Run the server
def serverStart(self):
# init HTTP Daemon
http_daemon = HTTPServer((self.__HOST, self.__PORT), webServerHandler)
http_daemon.serve_forever()
print("Info: Server started")
我用以下命令执行它:
server = webServerHandler()
server.serverStart()
当我尝试执行它时,会给我这个错误:
TypeError: __init__() missing 3 required positional arguments: 'request', 'client_address', and 'server'
我做错了什么?
答案 0 :(得分:2)
之所以发生此错误,是因为BaseHTTPRequestHandler
具有3 required arguments,因此您的webServerHandler
类扩展了BaseHTTPRequestHandler
并且没有覆盖构造方法也< / em>具有相同的必需参数。
当您需要用webServerHandler()
,webServerHandler
和{{1}来调用request
时,您将不带任何参数地调用client_address
}参数。
答案 1 :(得分:1)
让我们遵循MRO:
In [351]: http.server.BaseHTTPRequestHandler.__mro__
Out[351]:
(http.server.BaseHTTPRequestHandler,
socketserver.StreamRequestHandler,
socketserver.BaseRequestHandler,
object)
并且__init__
在socketserver.BaseRequestHandler
中定义:
def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server
self.setup()
try:
self.handle()
finally:
self.finish()
如您所见,您需要提供所需的3个位置参数(request
,client_address
,server
),以实例化异常中提到的实例。