0

我有一个特殊的数据库类实例,我想将它传递给 HTTPServer 处理程序,以便我可以将它返回以在我的 do_GET 和 do_POST 回调处理程序中使用。我尝试子类化以将我的数据库类作为附加参数添加到 Handler... 但是这并没有将它一直深入到我的 HTTPServerRequestHandler 类中。

我也尝试过的没有奏效:

即使我确实设法将参数添加到 HTTPServerRequestHandler 类,这只会产生错误,因为 serve_forever 仍将使用原始的 4 个(self+3)参数回调该类,省略我的第 5 个(数据库)参数。

以前,我会将数据库类实例化为全局常量,但这似乎是个坏主意。

这是我到目前为止所做的工作:

此代码成功地为我的页面提供服务,但我无权访问任何数据库方法(包括我的日志处理程序,它是数据库实例的一部分):

def run_server(state_database, port):
    state_database.log.info('starting server.')
    server_address = ('', port)

    HandlerClass = MakeHandlerClassforDB(state_database)

    httpserver = HTTPServer(server_address, HandlerClass)
    state_database.log.info('Server loaded.')
    httpserver.serve_forever()


def MakeHandlerClassforDB(state_database):
    class CustomHandler(HTTPServerRequestHandler, object):
        def __init__(self, *args, **kwargs):
            self.database = state_database
            super(CustomHandler, self).__init__(*args, **kwargs)
    return CustomHandler


# HTTPRequestHandler class
# noinspection PyPep8Naming
class HTTPServerRequestHandler(BaseHTTPRequestHandler):
    def __init__(self, request, client_address, server):
        BaseHTTPRequestHandler.__init__(self, request, client_address, server)
        # would like to be able to get database into here as a self....
    def do_GET(self):
        ip = self.client_address[0].split(".")
        if ip[0] in self.page.blocked_ip_highs:
            # `self.database` does not resolve, so this does not work...
            self.database.log.info(
                "Ignored request from %s" % self.client_address)
            return
          ...

    def do_POST(self):
        time_start = time.time()
        # again, self.database does not exist in the callback
        self.database.log.debug(
            "Headers_________\n%s\n______________\n" % self.headers)

我也希望这适用于 Python 3 和 Python 2(这就是我不使用的原因super().__init__(...)。)

4

1 回答 1

0

这似乎有效:

def run_server(state_database, port):
    server_address = ('', port)

    handlerclass = makehandlerclassfordb(state_database)
    httpserver = HTTPServer(server_address, handlerclass)

    httpserver.serve_forever()


def makehandlerclassfordb(state_database):
    class CustomHandler(HTTPServerRequestHandler, object):
        def __init__(self, *args, **kwargs):
            self.database = state_database
            self.page = HTMLPage()

            super(CustomHandler, self).__init__(*args, **kwargs)
    return CustomHandler


class HTTPServerRequestHandler(BaseHTTPRequestHandler):

     def do_GET(self):
        self.database.log.debug(
            "Get Header_________%s______________" % self.headers)

        """both self.page and self.database DO resolve (although
            PyCharm does not think they should :P )"""

        ip = self.client_address[0].split(".")
        if ip[0] in self.page.blocked_ip_highs:
            self.database.log.info(
                "Ignored request from %s" % self.client_address)
            return

我可以将项目重新添加到类 HTTPServerRequestHandler __init__,但这不会改变功能,我认为没有理由让 IDE 错误消失。

于 2017-02-16T23:08:26.513 回答