Kenny Powers
Kenny Powers

Reputation: 1274

How do I fix this KeyError error using Flask-SocketIO?

This seems to be a common problem when I search around, but I can't seem to find a viable resolution. The error is not very helpful as far as I can tell as it doesn't really tell you why the saved session is gone.

 Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/eventlet/wsgi.py", line 481, in handle_one_response
    result = self.application(self.environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask_socketio/__init__.py", line 37, in __call__
    start_response)
  File "/usr/local/lib/python2.7/dist-packages/engineio/middleware.py", line 47, in __call__
    return self.engineio_app.handle_request(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/socketio/server.py", line 303, in handle_request
    return self.eio.handle_request(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/engineio/server.py", line 226, in handle_request
    environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/engineio/socket.py", line 79, in handle_get_request
    start_response)
  File "/usr/local/lib/python2.7/dist-packages/engineio/socket.py", line 118, in _upgrade_websocket
    return ws(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/engineio/async_eventlet.py", line 13, in __call__
    return super(WebSocketWSGI, self).__call__(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/eventlet/websocket.py", line 127, in __call__
    self.handler(ws)
  File "/usr/local/lib/python2.7/dist-packages/engineio/socket.py", line 180, in _websocket_handler
    self.receive(pkt)
  File "/usr/local/lib/python2.7/dist-packages/engineio/socket.py", line 48, in receive
    self.server._trigger_event('message', self.sid, pkt.data)
  File "/usr/local/lib/python2.7/dist-packages/engineio/server.py", line 330, in _trigger_event
    return self.handlers[event](*args)
  File "/usr/local/lib/python2.7/dist-packages/socketio/server.py", line 429, in _handle_eio_message
    self._handle_event(sid, pkt.namespace, pkt.id, pkt.data)
  File "/usr/local/lib/python2.7/dist-packages/socketio/server.py", line 371, in _handle_event
    r = self._trigger_event(data[0], namespace, sid, *data[1:])
  File "/usr/local/lib/python2.7/dist-packages/socketio/server.py", line 397, in _trigger_event
    return self.handlers[namespace][event](*args)
  File "/usr/local/lib/python2.7/dist-packages/flask_socketio/__init__.py", line 199, in _handler
    self.server.environ[sid]['saved_session'] = {}
KeyError: 'baee47721e474a1a9885b41ee0ce1847'

Upvotes: 3

Views: 4953

Answers (1)

Miguel Grinberg
Miguel Grinberg

Reputation: 67479

First of all, upgrade the following packages: flask-socketio, python-socketio and python-engineio.

I think that will address your issues. This problem occurred with older versions of Flask-SocketIO. The cause that I identified for this condition was that a handler function (these functions you decorate with socketio.on() decorator) ran for a very long time without properly releasing the CPU. If the function ran for longer than 60 seconds without releasing the CPU, then the system mistakenly considered that the client was gone and disconnected the session, causing a KeyError when that session was accessed later.

The error is addressed in the latest release. But also please make sure you release the CPU so that other tasks that run in the background get a chance to do what they need to do.

Upvotes: 6

Related Questions