Flask-SocketIO: Flask_SocketIO (OverFlow) Session if i had any Flask_login or SQLAlchemy commands within any of it's funtions
the server breaks with this error within 10-11 refreshes or left it for about 2-5 mins
(please note: this server is hosted locally for development only and I’m the only user on it, there is not reason for it to get overflow without a fundamental issue.)
sqlalchemy.exc.TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/13/3o7r)
followed by this error
BrokenPipeError: [WinError 10058] A request to send or receive data was disallowed because the socket had already been shut down in that direction with a previous shutdown call
I have this code running on it. `@socketio.on(‘custom_emit’)
def custom_emit(data):
if current_user.is_authenticated: # (**FLASK_LOGIN**)
_id = current_user.get_id() # (**FLASK_LOGIN**)
x = users.query.filter_by(1).first() # (**FLASK_SQLALCHEMY**)
socketio.emit('update_me',{'my_id':x })`
if I make 5-15 refreshes with this code I get the previously mentioned error
If I removed BOTH (FLASK_LOGIN & FLASK_SQLALCHEMY) from the code and only used regular python or socketIO commands , I could spam refreshing as much as I want.
I could use Flask_SQLALECHMY with Flask_Login together but once SOCKETIO is involved, apparently opened sessions doesn’t get teardown.
details on my system’s configurations
app = Flask(__name__)
app.secret_key= _hidden_
app.config['WTF_CSRF_SECRET_KEY'] = _hidden_
app.config['SQLALCHEMY_DATABASE_URI']= _hidden_
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
login = LoginManager(app)
login.init_app(app)
@app.teardown_appcontext
def shutdown_session(exception=None):
print(f'\n now shutting down request:{db.session} \n')
db.session.remove()
@login.user_loader
def load_user(n):
try:
return users.query.get(int(n))
except:
return None
socketio = SocketIO(app, manage_session=False)
if __name__ == "__main__":
socketio.run(app,debug=True )
more details on the errors
Traceback (most recent call last):
File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 573, in handle_one_response
result = self.application(self.environ, start_response)
File "<hidden_python_directory>\lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\flask_socketio\__init__.py", line 45, in __call__
return super(_SocketIOMiddleware, self).__call__(environ,
File "<hidden_python_directory>\lib\site-packages\engineio\middleware.py", line 60, in __call__
return self.engineio_app.handle_request(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\socketio\server.py", line 571, in handle_request
return self.eio.handle_request(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\engineio\server.py", line 392, in handle_request
packets = socket.handle_get_request(
File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 103, in handle_get_request
return getattr(self, '_upgrade_' + transport)(environ,
File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 158, in _upgrade_websocket
return ws(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\engineio\async_drivers\eventlet.py", line 20, in __call__
return super(WebSocketWSGI, self).__call__(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 130, in __call__
self.handler(ws)
File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 184, in _websocket_handler
pkt = ws.wait()
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 788, in wait
for i in self.iterator:
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 643, in _iter_frames
message = self._recv_frame(message=fragmented_message)
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 669, in _recv_frame
header = recv(2)
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 578, in _get_bytes
d = self.socket.recv(numbytes - len(data))
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 365, in recv
return self._recv_loop(self.fd.recv, b'', bufsize, flags)
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 359, in _recv_loop
self._read_trampoline()
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 327, in _read_trampoline
self._trampoline(
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 208, in _trampoline
return trampoline(fd, read=read, write=write, timeout=timeout,
File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\__init__.py", line 159, in trampoline
return hub.switch()
File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\hub.py", line 313, in switch
return self.greenlet.switch()
socket.timeout: timed out
127.0.0.1 - - [12/Mar/2021 13:36:55] "GET /socket.io/?EIO=4&transport=websocket&sid=Wu2Ou1x4dEJnfaynAAAo HTTP/1.1" 500 0 30.117126
Traceback (most recent call last):
File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 573, in handle_one_response
result = self.application(self.environ, start_response)
File "<hidden_python_directory>\lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\flask_socketio\__init__.py", line 45, in __call__
return super(_SocketIOMiddleware, self).__call__(environ,
File "<hidden_python_directory>\lib\site-packages\engineio\middleware.py", line 60, in __call__
return self.engineio_app.handle_request(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\socketio\server.py", line 571, in handle_request
return self.eio.handle_request(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\engineio\server.py", line 392, in handle_request
packets = socket.handle_get_request(
File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 103, in handle_get_request
return getattr(self, '_upgrade_' + transport)(environ,
File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 158, in _upgrade_websocket
return ws(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\engineio\async_drivers\eventlet.py", line 20, in __call__
return super(WebSocketWSGI, self).__call__(environ, start_response)
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 130, in __call__
self.handler(ws)
File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 184, in _websocket_handler
pkt = ws.wait()
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 788, in wait
for i in self.iterator:
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 643, in _iter_frames
message = self._recv_frame(message=fragmented_message)
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 669, in _recv_frame
header = recv(2)
File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 578, in _get_bytes
d = self.socket.recv(numbytes - len(data))
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 365, in recv
return self._recv_loop(self.fd.recv, b'', bufsize, flags)
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 359, in _recv_loop
self._read_trampoline()
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 327, in _read_trampoline
self._trampoline(
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 208, in _trampoline
return trampoline(fd, read=read, write=write, timeout=timeout,
File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\__init__.py", line 159, in trampoline
return hub.switch()
File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\hub.py", line 313, in switch
return self.greenlet.switch()
socket.timeout: timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 357, in __init__
self.handle()
File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 390, in handle
self.handle_one_request()
File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 466, in handle_one_request
self.handle_one_response()
File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 616, in handle_one_response
write(err_body)
File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 538, in write
wfile.flush()
File "<hidden_python_directory>\lib\socket.py", line 722, in write
return self._sock.send(b)
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 396, in send
return self._send_loop(self.fd.send, data, flags)
File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 383, in _send_loop
return send_method(data, *args)
BrokenPipeError: [WinError 10058] A request to send or receive data was disallowed because the socket had already been shut down in that direction with a previous shutdown call
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Comments: 25 (12 by maintainers)
I already explained this. Flask-SocketIO does not use your database session. There is nothing in Flask-SocketIO that requires database use. And also, the teardown handlers are for Flask requests, they are not used at all by Flask-SocketIO and this is by design, since Socket.IO does not have the concept of requests.
To summarize: Flask-SocketIO does not know anything about Flask-SQLAlchemy and Flask-SQLAlchemy does not know anything about Flask-SocketIO. If you use your database session in your Socket.IO handlers, you have to manage the allocation of sessions yourself.