dockerflasksocket.iogunicorneventlet

Sending and receiving events successfully with socket.io, but nothing is happening


I'm trying to get my webapp to send messages and I can't figure out why it isn't working. There are no errors that I can see, it's just that the actions in my event.py function aren't happening. I am running a gunicorn server with eventlet workers serving a flask app.

Here's the command that starts the gunicorn server through docker:

CMD [ "gunicorn", "--reload", "-b", "0.0.0.0:5000", "--worker-class", "eventlet", "-w", "1", "app:app"]

here's the relevant code on notes.html:

// Imports socketio
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">

// sets domain to talk to. (empty sets it to localhost)
const socket = io()

// send message to server on trigger from form.
socket.emit('send_new_session', new_session_form_id.value, new_session_form_number.value, new_session_form_title.value, new_session_form_synopsis.value)
console.log('send_new_session')

// console logs the message here, do I know it's getting this far. The problem seems to be that the server isn't getting the message for some reason.

events.py:

from . import db, socketio
from .classes import *
from flask_socketio import emit

@socketio.on('send_new_session')
def send_new_session(id, number, title, synopsis=None):
    print("arrived!!!!!!!!!!!")
    # more code that adds the new session the the database
    ..

I have the logging correctly set up to stdout but I never see the "arrived" message, so I know it's never hitting the server.

here is the server logs for when I send the message:

rest-server    | Bpt-ydbpGYLF-HGKAAAC: Sending packet OPEN data {'sid': 'Bpt-ydbpGYLF-HGKAAAC', 'upgrades': ['websocket'], 'pingTimeout': 20000, 'pingInterval': 25000}
rest-server    | Bpt-ydbpGYLF-HGKAAAC: Received packet MESSAGE data 0
rest-server    | Bpt-ydbpGYLF-HGKAAAC: Sending packet MESSAGE data 0{"sid":"MRAxFiGYyLB3C6MBAAAD"}
rest-server    | Bpt-ydbpGYLF-HGKAAAC: Received request to upgrade to websocket
rest-server    | Bpt-ydbpGYLF-HGKAAAC: Upgrade to websocket successful
rest-server    | Bpt-ydbpGYLF-HGKAAAC: Received packet MESSAGE data 2["send_new_session","1","2","foo","bar"]
rest-server    | received event "send_new_session" from MRAxFiGYyLB3C6MBAAAD [/]
rest-server    | Bpt-ydbpGYLF-HGKAAAC: Sending packet PING data None
rest-server    | Bpt-ydbpGYLF-HGKAAAC: Received packet PONG data 

you can see in the log that the message is in fact being sent and received, but for some reason the actions in the event aren't happening. I've been trying everything I can think of for a couple days not. any help would be greatly appreciated!!


Everything below here is probably not relevant, but if it it helps, this is how I set up the app:


file set up:

/app
--app.py
--requirements.txt
--Dockerfile
--docker-compose.yml
--.flaskenv
--/project
----/static
----/templates
----__init__.py
----settings.py
----events.py
----BONapp.py
----auth.py
etc...

settings.py

import os
from flask import Flask

app = Flask(__name__)
db_password = os.environ.get('DB_PASS')

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:' + db_password + '@bonmysqldb:3306/BON'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = db_password

init.py

from flask_login import LoginManager
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO
from .settings import app

db = SQLAlchemy(app)
socketio = SocketIO(app, logger=True, engineio_logger=True)

def create_app():

    migrate = Migrate(app, db)
    from .classes import Users

    db.init_app(app)
    socketio.init_app(app)
    
    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app) 

    # provide login_manager with a unicode user ID
    @login_manager.user_loader
    def load_user(user_id):
        return Users.query.get(int(user_id))

    # blueprint for auth routes of app
    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    # blueprint for non-auth parts of app
    from .BONapp import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

app.py

from project.__init__ import create_app

app = create_app() 

Solution

  • I figured it out while reading over my question again...

    it was in events.py I changed:

    from . import db, socketio
    

    to:

    from .__init__ import db, socketio
    

    I'm not exactly sure why that mattered but it fixed it. facepalm