0

我一直在开发一个应用程序,它包含一个小型、简单的 http 服务器,用于偶尔处理 post 请求。服务器及其周围的所有功能都运行良好,但每次服务器运行时,日志输出都会告诉我我的代码正在运行多次,加上 http 服务器处理的每个请求运行一次。

class HttpApp:
    def __init__(self, host="localhost", port=25565):
        logging = Util.configure_logging(__name__)
        server_address = (host, port)
        httpd = HTTPServer(server_address, ServerObject)
        logging.info('Starting httpd...\n')
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            pass
        httpd.server_close()
        logging.info('Stopping httpd...\n')

class ServerObject(BaseHTTPRequestHandler):
    def _set_response(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def do_GET(self):
        print("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
        self._set_response()
        self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        content_type = str(self.headers['Content-Type'])
        # print(content_length)
        post_data = self.rfile.read(content_length)
        if content_type == "application/json":
            parsed_data = json.loads(post_data.decode('utf-8'))
        else:
            print("Bad request!")
            self._set_response()
            self.wfile.write(json.dumps({"Response": "Bad Request"}).encode('utf-8'))
        print("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n" %
            (str(self.path), str(self.headers), parsed_data))
        print("Parsed Params: %s" % parsed_data)
        def free_port():
            free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            free_socket.bind(('0.0.0.0', 0))
            free_socket.listen(5)
            port = free_socket.getsockname()[1]
            free_socket.close()
            return port
        rand_port = free_port()
        SpawnSlave(category=parsed_data["category"], tag=parsed_data["tag"], filename=parsed_data["filename"], port=rand_port)
        self._set_response()
        self.wfile.write(json.dumps({"port": rand_port}).encode('utf-8'))

cli 应用程序将信息传递给 HttpApp,然后基于该信息启动。一旦它第一次收到连接,它就会正常执行其步骤并且只打印一次输出。第二次,输出被打印两次,依此类推。此服务器仅处理发布请求。我已经检查了我的代码几次,以确保我不会多次调用它,但我似乎被难住了。有关更多上下文,更多此代码可在github上找到,但这是唯一相关的部分。

4

1 回答 1

0

事实证明,这不是我的代码的问题,而是我使用的记录器的问题,它为同一个记录器添加了多个控制台处理程序,导致重复输出。我在我的 cli 库中修复了这个问题。

于 2021-05-11T00:39:50.643 回答