24

データベース接続を EchoHandler クラスに渡したいのですが、それを行う方法や EchoHandler クラスにアクセスする方法がまったくわかりません。

クラス EchoHandler(SocketServer.StreamRequestHandler):
    デフハンドル(自己):
        print self.client_address、「接続済み」

__name__ == '__main__' の場合:
    conn = MySQLdb.connect (ホスト = "10.0.0.5"、ユーザー = "ユーザー"、passwd = "パス"、db = "データベース")

    SocketServer.ForkingTCPServer.allow_reuse_address = 1

    サーバー = SocketServer.ForkingTCPServer(('10.0.0.6', 4242), EchoHandler)

    print "サーバーは localhost:4242 でリッスンしています..."
    試す:
        server.allow_reuse_address
        server.serve_forever()
    キーボード割り込みを除く:
        print "\nベイリング中..."
4

5 に答える 5

31

残念ながら、サーバーの外部からハンドラに直接アクセスする簡単な方法はありません。

EchoHandler インスタンスに情報を取得するには、次の 2 つのオプションがあります。

  1. 接続をサーバーのプロパティとして保存し ( をserver.conn = conn呼び出す前に追加server_forever())、 を介して EchoHandler.handler でそのプロパティにアクセスしますself.server.conn
  2. サーバーの値を上書きして、finish_requestそこに値を割り当てることができます (EchoHandler のコンストラクターに渡して、EchoHandler.__init__ を上書きする必要があります)。これははるかに厄介なソリューションであり、とにかくサーバーに接続を保存する必要があります。

あなたの最善の策の私のオプション:

class EchoHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        # I have no idea why you would print this but this is an example
        print( self.server.conn );
        print self.client_address, 'connected'

if __name__ == '__main__':
    SocketServer.ForkingTCPServer.allow_reuse_address = 1

    server = SocketServer.ForkingTCPServer(('10.0.0.6', 4242), EchoHandler)
    server.conn = MySQLdb.connect (host = "10.0.0.5", 
                     user = "user", passwd = "pass", db = "database")
    # continue as normal
于 2011-07-29T15:58:17.480 に答える
11

マーク T は、Python リスト アーカイブについて次のように述べています。

ハンドラー クラスでは、self.server はサーバー オブジェクトを参照するため、サーバーをサブクラス化し、initをオーバーライドして、追加のサーバー パラメーターを取得し、それらをインスタンス変数として格納します。


import SocketServer

class MyServer(SocketServer.ThreadingTCPServer):

    def __init__(self, server_address, RequestHandlerClass, arg1, arg2):
        SocketServer.ThreadingTCPServer.__init__(self, 
                                                 server_address, 
                                                 RequestHandlerClass)
        self.arg1 = arg1
        self.arg2 = arg2


class MyHandler(SocketServer.StreamRequestHandler):

    def handle(self):
        print self.server.arg1
        print self.server.arg2

于 2013-01-03T04:47:24.373 に答える