4

Flask を実行しているサーバーで Flask-Socketio を使用しており、クライアントは JavaScript を実行しています。すべてのクライアントは、名前空間を使用してサーバーに接続します'/test'。クライアントで特定のアクションが発生すると、接続されているすべてのクライアントを反復処理するサーバー上の関数をクライアントがトリガーするようにします。次のコード セグメントを使用して、接続されているクライアントのリストを反復処理しています。

for sessid, socket in request.namespace.socket.server.sockets.items():
    print "socket id : %r" % (socket['/test'].session['id'])

各接続には、接続時に割り当てられた「id」キーがあります。

ただし、名前空間キーが見つからなかったことを示す次のエラーがサーバーから返されることがあります。

Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gevent/greenlet.py", line 327, in run
  result = self._run(*self.args, **self.kwargs)
File "/usr/local/lib/python2.7/dist-packages/socketio/virtsocket.py", line 403, in_receiver_loop
  retval = pkt_ns.process_packet(pkt)
File "/usr/local/lib/python2.7/dist-packages/socketio/namespace.py", line 155, in process_packet
  return self.process_event(packet)
File "/usr/local/lib/python2.7/dist-packages/flask_socketio/__init__.py", line 64, in process_event
  return self.socketio._dispatch_message(app, self, message, args)
File "/usr/local/lib/python2.7/dist-packages/flask_socketio/__init__.py", line 137, in _dispatch_message
  ret = self.messages[namespace.ns_name][message](*args)
File "/home/ubuntu/flask-app/current/py/flaskapp/main/sockets.py", line 190, in gameInitialisedByClient
  print "id : %r  random: %r" % (socket['/test'].session['id'], socket['/test'].session['random'])
File "/usr/local/lib/python2.7/dist-packages/socketio/virtsocket.py", line 190, in __getitem__
  return self.active_ns[key]
KeyError: '/test'
<Greenlet at 0x7f483bc6bf50: <bound method Socket._receiver_loop of <socketio.virtsocket.Socket object at 0x7f483a5ac6d0>>> failed with KeyError

サーバーに接続するすべてのソケットが同じ名前空間に接続しているため、このエラーが発生する理由がわかりません。さらに、このエラーは関数呼び出しの一部でのみ発生します。このエラーが一貫していないのはなぜですか?

接続されているクライアントのリストを反復処理するより良い方法はありますか?

4

1 に答える 1