from threading import Lock from flask import Flask, request, session from flask_socketio import Namespace, join_room, leave_room, SocketIO, emit, rooms, close_room, disconnect from common import config app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' # TODO: test mode mode "threading", "eventlet" or "gevent" socketio = SocketIO(app, async_mode=None) # TODO: wth is that?! thread = None thread_lock = Lock() @app.route("/") def page_index(): return "Hello, world" def background_thread(): """Example of how to send server generated events to clients.""" count = 0 while True: socketio.sleep(10) count += 1 socketio.emit('my_response', {'data': 'Server generated event', 'count': count}, namespace='/test') # When class-based namespaces are used, any events received by the server are dispatched to a method named as the # event name with the on_ prefix. For example, event my_event will be handled by a method named on_my_event class BingoNamespace(Namespace): def on_my_event(self, message): session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': message['data'], 'count': session['receive_count']}) def on_my_broadcast_event(self, message): session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': message['data'], 'count': session['receive_count']}, broadcast=True) def on_join(self, message): join_room(message['room']) session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': 'In rooms: ' + ', '.join(rooms()), 'count': session['receive_count']}) def on_leave(self, message): leave_room(message['room']) session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': 'In rooms: ' + ', '.join(rooms()), 'count': session['receive_count']}) def on_close_room(self, message): session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.', 'count': session['receive_count']}, room=message['room']) close_room(message['room']) def on_my_room_event(self, message): session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': message['data'], 'count': session['receive_count']}, room=message['room']) def on_disconnect_request(self): session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': 'Disconnected!', 'count': session['receive_count']}) disconnect() def on_my_ping(self): emit('my_pong') def on_connect(self): global thread with thread_lock: if thread is None: thread = socketio.start_background_task(background_thread) emit('my_response', {'data': 'Connected', 'count': 0}) def on_disconnect(self): print('Client disconnected', request.sid) if __name__ == "__main__": socketio.run( app=app, port=config["API_PORT"], host=config["API_HOST"], )