Skip to content

Commit

Permalink
add @socketio.event convenience decorator
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelgrinberg committed Dec 12, 2020
1 parent 0c674b8 commit 62717a8
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 19 deletions.
30 changes: 15 additions & 15 deletions example/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,22 @@ def index():
return render_template('index.html', async_mode=socketio.async_mode)


@socketio.on('my_event')
def test_message(message):
@socketio.event
def my_event(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('my_response',
{'data': message['data'], 'count': session['receive_count']})


@socketio.on('my_broadcast_event')
def test_broadcast_message(message):
@socketio.event
def my_broadcast_event(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('my_response',
{'data': message['data'], 'count': session['receive_count']},
broadcast=True)


@socketio.on('join')
@socketio.event
def join(message):
join_room(message['room'])
session['receive_count'] = session.get('receive_count', 0) + 1
Expand All @@ -56,7 +56,7 @@ def join(message):
'count': session['receive_count']})


@socketio.on('leave')
@socketio.event
def leave(message):
leave_room(message['room'])
session['receive_count'] = session.get('receive_count', 0) + 1
Expand All @@ -65,24 +65,24 @@ def leave(message):
'count': session['receive_count']})


@socketio.on('close_room')
def close(message):
@socketio.event
def close_room(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'])


@socketio.on('my_room_event')
def send_room_message(message):
@socketio.event
def my_room_event(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('my_response',
{'data': message['data'], 'count': session['receive_count']},
room=message['room'])


@socketio.on('disconnect_request')
@socketio.event
def disconnect_request():
@copy_current_request_context
def can_disconnect():
Expand All @@ -97,13 +97,13 @@ def can_disconnect():
callback=can_disconnect)


@socketio.on('my_ping')
def ping_pong():
@socketio.event
def my_ping():
emit('my_pong')


@socketio.on('connect')
def test_connect():
@socketio.event
def connect():
global thread
with thread_lock:
if thread is None:
Expand Down
35 changes: 35 additions & 0 deletions flask_socketio/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,41 @@ def on_foo_event(json):
"""
self.on(message, namespace=namespace)(handler)

def event(self, *args, **kwargs):
"""Decorator to register an event handler.
This is a simplified version of the ``on()`` method that takes the
event name from the decorated function.
Example usage::
@socketio.event
def my_event(data):
print('Received data: ', data)
The above example is equivalent to::
@socketio.on('my_event')
def my_event(data):
print('Received data: ', data)
A custom namespace can be given as an argument to the decorator::
@socketio.event(namespace='/test')
def my_event(data):
print('Received data: ', data)
"""
if len(args) == 1 and len(kwargs) == 0 and callable(args[0]):
# the decorator was invoked without arguments
# args[0] is the decorated function
return self.on(args[0].__name__)(args[0])
else:
# the decorator was invoked with arguments
def set_handler(handler):
return self.on(handler.__name__, *args, **kwargs)(handler)

return set_handler

def on_namespace(self, namespace_handler):
if not isinstance(namespace_handler, Namespace):
raise ValueError('Not a namespace instance.')
Expand Down
8 changes: 4 additions & 4 deletions test_socketio.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ def on_disconnect():
disconnected = '/'


@socketio.on('connect', namespace='/test')
def on_connect_test():
@socketio.event(namespace='/test')
def connect():
send('connected-test')
send(json.dumps(request.args.to_dict(flat=False)))
send(json.dumps({h: request.headers[h] for h in request.headers.keys()
Expand All @@ -45,8 +45,8 @@ def on_disconnect_test():
disconnected = '/test'


@socketio.on('message')
def on_message(message):
@socketio.event
def message(message):
send(message)
if message == 'test session':
session['a'] = 'b'
Expand Down

0 comments on commit 62717a8

Please sign in to comment.