我有一個特殊的數據庫類實例,我想要傳入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都工作
對不起,也許它是愚蠢的......但爲什麼你不把它做成全局的或者使用全局的「單例」來保存它,'''run_server''可以將它傳遞給「單例」(會詳細說明如果感興趣) –
我說「笨」......哈克比較合適。看看代碼似乎RequestHandler接收''__init__'''中的服務器實例......你是否試圖將'database'粘貼到服務器實例並從那裏使用它? –
我的意思是'httpserver',在'httpserver = HTTPServer(server_address,HandlerClass)'嘗試'httpserver.database = state_database'後,然後在'HTTPServerRequestHandler'中,如果你有權訪問'server', server.database'。 (只是在黑暗中關閉) –