私はdo_GETコールバックハンドラとdo_POSTコールバックハンドラで使用するためにHTTPServerハンドラに渡す必要のある特別なデータベースクラスインスタンスを持っています。私はハンドラへの追加引数として自分のデータベースクラスを追加するためにサブクラス化を試みました...しかし、それは私のHTTPServerRequestHandlerクラスのすべての方法を取得しません。私も働かなかったことを試みた何HTTPServerが自分のクラスをdo_GETで戻す方法を教えてください。
:
を私は引数がHTTPServerRequestHandlerクラスに追加取得する管理しない場合でもserve_foreverはまだ元の4を使用してクラスをコールバックされますので、これが唯一の(エラーが発生します自己+ 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(server_address、HandlerClass)'の後に 'httpserver.database = state_database'を実行してから' HTTPServerRequestHandler'に 'http'を意味しました。 server.database'となります。 (ちょうど暗闇の中で閉まる) –