2017-02-16 28 views
0

我有一個特殊的數據庫類實例,我想要傳入HTTPServer處理程序,以便我可以讓它返回以供我的do_GET和do_POST回調處理程序使用。我試圖通過子類來添加我的數據庫類作爲處理程序的附加參數...但是,這並沒有讓我一直到我的HTTPServerRequestHandler類。如何讓HTTPServer通過do_GET返回自己的類?

我也試過,沒有工作:

即使我設法得到的參數添加到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都工作

+0

對不起,也許它是愚蠢的......但爲什麼你不把它做成全局的或者使用全局的「單例」來保存它,'''run_server''可以將它傳遞給「單例」(會詳細說明如果感興趣) –

+0

我說「笨」......哈克比較合適。看看代碼似乎RequestHandler接收''__init__'''中的服務器實例......你是否試圖將'database'粘貼到服務器實例並從那裏使用它? –

+0

我的意思是'httpserver',在'httpserver = HTTPServer(server_address,HandlerClass)'嘗試'httpserver.database = state_database'後,然後在'HTTPServerRequestHandler'中,如果你有權訪問'server', server.database'。 (只是在黑暗中關閉) –

回答

0

這似乎工作(這就是爲什麼我不使用super().__init__(...)):

​​

我可以重新添加項目到類HTTPServerRequestHandler __init__,但這並沒有改變功能,我沒有理由只是爲了使IDE錯誤消失。

相關問題