如何使用 Flask-SocketIO 修复此 KeyError 错误?
Posted
技术标签:
【中文标题】如何使用 Flask-SocketIO 修复此 KeyError 错误?【英文标题】:How do I fix this KeyError error using Flask-SocketIO? 【发布时间】:2016-10-30 04:42:28 【问题描述】:当我四处搜索时,这似乎是一个常见问题,但我似乎找不到可行的解决方案。据我所知,该错误不是很有帮助,因为它并没有真正告诉您保存的会话消失的原因。
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'
【问题讨论】:
你使用的是什么版本的Flask-socketIO
?
我在此处的 cmets 之前使用的是 2.1 版本,建议升级到 2.5,最终解决了问题。谢谢
【参考方案1】:
首先,升级以下包:flask-socketio、python-socketio和python-engineio。
我认为这将解决您的问题。旧版本的 Flask-SocketIO 会出现此问题。我为这种情况确定的原因是处理程序函数(您使用 socketio.on()
装饰器装饰的这些函数)运行了很长时间而没有正确释放 CPU。如果函数运行超过 60 秒而没有释放 CPU,则系统错误地认为客户端已离开并断开会话,导致稍后访问该会话时发生 KeyError。
该错误已在最新版本中得到解决。但也请确保您释放 CPU,以便在后台运行的其他任务有机会执行他们需要执行的操作。
【讨论】:
做到了。非常感谢!除了flask-socketio,我已经升级了所有东西,但不知何故忽略了这一点。此外,我喜欢这个扩展,并希望对你投入的时间表示衷心的感谢。它为我打开了一个充满可能性的世界!谢谢! 我面临同样的错误信息问题。我正在使用最新版本的 Flask-SocketIO==4.2.1 运行应用程序,在使用带有登录管理器的 flask-login 实现身份验证之前,它一直正常工作。 我怎样才能在这个片段中释放 CPU:const askServer = () => console.log('start'); socket.emit('x', function (data) console.log('x'); ) socket.on('server event', (data) => console.log('server event:', data) )
?以上是关于如何使用 Flask-SocketIO 修复此 KeyError 错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何访问使用 websockets 发送的烧瓶中的 formData?Flask-SocketIO
在 Flask-SocketIO 上使用 ssl 设置 ping_timeout
如何在 docker 容器中设置 flask-socketio?