2017-02-16 1 views
0

私は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の両方で仕事をしたい

+0

申し訳ありませんが多分それはダムです...しかし、なぜそれをグローバルにしたり、グローバルな "シングルトン"を使用して保持していないのですか? '' 'run_server''はそれを"シングルトン "興味があれば詳述します) –

+0

私は "ダム"と言っています...ハッキーはより適切です。コードを見ると、RequestHandlerはサーバーインスタンスを '' '__init__'''で受け取ったようです...サーバーインスタンスに' database'を貼り付けてそこから使用しようとしましたか? –

+0

'httpserver = HTTPServer(server_address、HandlerClass)'の後に 'httpserver.database = state_database'を実行してから' HTTPServerRequestHandler'に 'http'を意味しました。 server.database'となります。 (ちょうど暗闇の中で閉まる) –

答えて

0

は、これが動作するように表示されます(私はsuper().__init__(...)を使用していない理由です。):

​​

クラスHTTPServerRequestHandler __init__に項目を再追加することはできますが、これは機能を変更しないため、IDEエラーを消すための理由はありません。

関連する問題