Python 重写BaseHTTPRequestHandlerClass
我正在设置第一个存储POST请求的HTTP服务器。我对处理程序类BaseHTTPRequestHandler有问题。 在我的方法中,我希望将服务器响应客户机的响应代码传递给处理程序(出于自动测试的目的)。我在这里找到了很多帮助,我将在下面分享与我开发的子类相关的代码,但是我仍然需要弄清楚如何初始化我的处理程序,因为我不知道从哪里获得参数:“请求”、“客户端地址”和“服务器”。 我在他们各自的位置上打了三个问号。 谢谢你的帮助,很抱歉解释得不好Python 重写BaseHTTPRequestHandlerClass,python,superclass,basehttprequesthandler,Python,Superclass,Basehttprequesthandler,我正在设置第一个存储POST请求的HTTP服务器。我对处理程序类BaseHTTPRequestHandler有问题。 在我的方法中,我希望将服务器响应客户机的响应代码传递给处理程序(出于自动测试的目的)。我在这里找到了很多帮助,我将在下面分享与我开发的子类相关的代码,但是我仍然需要弄清楚如何初始化我的处理程序,因为我不知道从哪里获得参数:“请求”、“客户端地址”和“服务器”。 我在他们各自的位置上打了三个问号。 谢谢你的帮助,很抱歉解释得不好 class ServerHandler(BaseHT
class ServerHandler(BaseHTTPRequestHandler):
def __init__(self, response_code, request, client_address, server):
super().__init__(request, client_address, server)
self.response_code = response_code
def _set_header(self):
self.send_response(self.response_code)
self.send_header('content-type', 'text/html')
self.end_headers()
def do_HEAD(self):
self._set_header()
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST'}
)
# get POST data
utc = int(form.getvalue("utc"))
value = form.getvalue("value")
sn = form.getvalue("sn")
# manage data
dataManager(utc, sn, value)
# send response
self._set_header()
response = "<RESULT>0</RESULT>"
self.wfile.write(response.encode('utf-8'))
class Server:
def __init__(self, port, response_code=200, server_class=HTTPServer):
self.port = port
self.response_code = response_code
self.server_address = ('', self.port)
handler_class = ServerHandler(self.response_code, ?, ?, ?)
self.server = server_class(self.server_address, handler_class)
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
def run(self):
self.server_thread.start()
print("Server started")
def shutdown(self):
self.server.shutdown()
self.server.server_close()
print("Server stopped")
类ServerHandler(BaseHTTPRequestHandler):
定义初始化(自我、响应代码、请求、客户端地址、服务器):
super()。\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.response\u code=响应\u code
def_设置_收割台(自):
self.send\u响应(self.response\u代码)
self.send_标题('content-type','text/html')
self.end_头()
def do_头(自身):
self.\u set\u header()
def do_POST(自我):
form=cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
环境={'REQUEST_METHOD':'POST'}
)
#获取POST数据
utc=int(form.getvalue(“utc”))
value=form.getvalue(“value”)
sn=form.getvalue(“sn”)
#管理数据
数据管理器(utc、序列号、值)
#发送响应
self.\u set\u header()
响应=“0”
self.wfile.write(response.encode('utf-8'))
类服务器:
def uuu init uuuu(self,port,response_code=200,server_class=HTTPServer):
self.port=端口
self.response\u code=响应\u code
self.server_地址=(“”,self.port)
handler\u class=ServerHandler(self.response\u代码,,,,?)
self.server=server\u类(self.server\u地址,处理程序\u类)
self.server\u thread=threading.thread(target=self.server.serve\u)
self.server\u thread.daemon=True
def运行(自):
self.server_thread.start()
打印(“服务器已启动”)
def关闭(自):
self.server.shutdown()
self.server.server_close()
打印(“服务器已停止”)
我解决了以下问题。我没有将response_代码作为函数参数传递,而是将response_代码作为类变量添加,并从类服务器直接在公共类变量response_代码上编写。就这样。这不是最好的解决方案,但很有效。如果你有更好的主意,请告诉我
class ServerHandler(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
super().__init__(request, client_address, server)
self.response_code = response_code
def _set_header(self):
self.send_response(self.response_code)
self.send_header('content-type', 'text/html')
self.end_headers()
def do_HEAD(self):
self._set_header()
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST'}
)
# get POST data
utc = int(form.getvalue("utc"))
value = form.getvalue("value")
sn = form.getvalue("sn")
# manage data
dataManager(utc, sn, value)
# send response
self._set_header()
response = "<RESULT>0</RESULT>"
self.wfile.write(response.encode('utf-8'))
class Server:
def __init__(self, port, response_code=200, server_class=HTTPServer):
self.port = port
self.server_address = ('', self.port)
handler_class = ServerHandler
handler_class.response_code = response_code
self.server = server_class(self.server_address, handler_class)
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
def run(self):
self.server_thread.start()
print("Server started")
def shutdown(self):
self.server.shutdown()
self.server.server_close()
print("Server stopped")
类ServerHandler(BaseHTTPRequestHandler):
定义初始化(自我、请求、客户端地址、服务器):
super()。\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.response\u code=响应\u code
def_设置_收割台(自):
self.send\u响应(self.response\u代码)
self.send_标题('content-type','text/html')
self.end_头()
def do_头(自身):
self.\u set\u header()
def do_POST(自我):
form=cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
环境={'REQUEST_METHOD':'POST'}
)
#获取POST数据
utc=int(form.getvalue(“utc”))
value=form.getvalue(“value”)
sn=form.getvalue(“sn”)
#管理数据
数据管理器(utc、序列号、值)
#发送响应
self.\u set\u header()
响应=“0”
self.wfile.write(response.encode('utf-8'))
类服务器:
def uuu init uuuu(self,port,response_code=200,server_class=HTTPServer):
self.port=端口
self.server_地址=(“”,self.port)
handler\u class=ServerHandler
handler\u class.response\u code=response\u code
self.server=server\u类(self.server\u地址,处理程序\u类)
self.server\u thread=threading.thread(target=self.server.serve\u)
self.server\u thread.daemon=True
def运行(自):
self.server_thread.start()
打印(“服务器已启动”)
def关闭(自):
self.server.shutdown()
self.server.server_close()
打印(“服务器已停止”)
我解决了以下问题。我没有将response_代码作为函数参数传递,而是将response_代码作为类变量添加,并从类服务器直接在公共类变量response_代码上编写。就这样。这不是最好的解决方案,但很有效。如果你有更好的主意,请告诉我
class ServerHandler(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
super().__init__(request, client_address, server)
self.response_code = response_code
def _set_header(self):
self.send_response(self.response_code)
self.send_header('content-type', 'text/html')
self.end_headers()
def do_HEAD(self):
self._set_header()
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST'}
)
# get POST data
utc = int(form.getvalue("utc"))
value = form.getvalue("value")
sn = form.getvalue("sn")
# manage data
dataManager(utc, sn, value)
# send response
self._set_header()
response = "<RESULT>0</RESULT>"
self.wfile.write(response.encode('utf-8'))
class Server:
def __init__(self, port, response_code=200, server_class=HTTPServer):
self.port = port
self.server_address = ('', self.port)
handler_class = ServerHandler
handler_class.response_code = response_code
self.server = server_class(self.server_address, handler_class)
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
def run(self):
self.server_thread.start()
print("Server started")
def shutdown(self):
self.server.shutdown()
self.server.server_close()
print("Server stopped")
类ServerHandler(BaseHTTPRequestHandler):
定义初始化(自我、请求、客户端地址、服务器):
super()。\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.response\u code=响应\u code
def_设置_收割台(自):
self.send\u响应(self.response\u代码)
self.send_标题('content-type','text/html')
self.end_头()
def do_头(自身):
self.\u set\u header()
def do_POST(自我):
form=cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
环境={'REQUEST_METHOD':'POST'}
)
#获取POST数据
utc=int(form.getvalue(“utc”))
value=form.getvalue(“value”)
sn=form.getvalue(“sn”)
#管理数据
数据管理器(utc、序列号、值)
#发送响应
self.\u set\u header()
响应=“0”
self.wfile.write(response.encode('utf-8'))
类服务器:
def uuu init uuuu(self,port,response_code=200,server_class=HTTPServer):
self.port=端口
self.server_地址=(“”,self.port)
handler\u class=ServerHandler
handler\u class.response\u code=response\u code
self.server=server\u类(self.server\u地址,处理程序\u类)
self.server\u thread=threading.thread(target=self.server.serve\u)
self.server\u thread.daemon=True
def运行(自):
self.server_thread.start()
打印(“服务器已启动”)
def关闭(自):
self.server.shutdown()
self.server.server_close()
打印(“服务器已停止”)
Read。预期用途如下所示。预期用途