PythonのRequestHandler Handlerインスタンス内からSocketServerサーバーインスタンスの変数を変更するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3868132

質問

これが問題のコードです:

  class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
     __slots__ = ("loaded")

  class Handler(SocketServer.StreamRequestHandler):
     def handle(self):
        print self.server.loaded # Prints "False" at every call, why?
        self.server.loaded = True
        print self.server.loaded # Prints "True" at every call, obvious!

  server = Server(('localhost', port), Handler)
  server.loaded = False

  while True:
     server.handle_request()

新しいリクエストが入るたびに、私が得る出力は False に続く True. 。私が欲しいのはです False に続く True 初めて、そして True に続く True 今後。

サーバーインスタンスの変数に変更した変更が、ハンドラーの範囲外に持続しないのはなぜですか handle() 働き?

更新しました:

だから、私はグローバル変数を使用して自分が望むものを実現しようとします。

  loaded = False

  class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
     pass

  class Handler(SocketServer.StreamRequestHandler):
     def handle(self):
        global loaded
        print loaded # Prints "False" at every call still, why?
        loaded = True
        print loaded # Prints "True" at every call, obvious!

  def main():
     server = Server(('localhost', 4444), Handler)
     global loaded
     loaded = False

     while True:
        server.handle_request()

  if (__name__ == '__main__'):
     main()

まだ機能しません。つまり、以前と同じ出力を生成します。誰かが私がどこにいて間違っているのか教えてもらえますか?

役に立ちましたか?

解決

フォーキングは新しいプロセスを作成するため、元のプロセスでサーバーの変数を変更することはできません。代わりにthreadingtcpserverをお試しください。

import SocketServer

class Server(SocketServer.ThreadingTCPServer):
    __slots__ = ("loaded")

class Handler(SocketServer.StreamRequestHandler):
    def handle(self):
        self.server.loaded = not self.server.loaded
        print self.server.loaded # Alternates value at each new request now.

server = Server(('localhost',5000),Handler)
server.loaded = False

while True:
    server.handle_request()

他のヒント

あなたの問題は、socketserver.forkingmixinがすべての要求に合わせて新しいプロセスを作成することです。したがって、すべての変数がデフォルトの状態にリセットされるたびに、新しいリクエストがすべての変数に登場するたびに。したがって、本質的には、self.server.loadedに何を割り当てても、次のリクエストでリセットされます。これがグローバルが機能しない理由でもあります。

リクエスト間で持続するために変数が必要な場合は、そのデータをどこかに書くのが最適です。ER、永続的=)。基本的に、セッション変数を維持する問題を解決しようとしているように聞こえます。それを行う方法は100万あり、あなたの状況に応じて、ある方法は別の方法よりも適切であるかもしれません。他のPythonベースのSocketServerアプリケーションがどのように行うかを検討することを強くお勧めします。

「FileType:Py SocketServer ForkingMixin」(最初の結果の1つはCherrypyで、これを強くお勧めします)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top