How to emit SocketIO event on the serverside

django, gevent-socketio, python, socket.io, websocket

Solution

What you probably want to do is add a module variable to track connections, say `_connections`, like so:

_connections = {}

@namespace('/connect')
class ConnectNamespace(BaseNamespace):

and then add `initialize` and `disconnect` methods that use some happy identifier you can reference later:

def initialize(self, *args, **kwargs):
    _connections[id(self)] = self
    super(ConnectNamespace, self).initialize(*args, **kwargs)

def disconnect(self, *args, **kwargs):
    del _connections[id(self)]
    super(ConnectNamespace, self).disconnect(*args, **kwargs)

When you need to generate an event, you can then just look up the right connection in the `_connections` variable, and fire off the event with `emit`.

(Didn't test any of this, but I've used a similar pattern in many other languages: don't see any reason why this wouldn't work in Python as well).

Problem

I'm running a gevent-socketio Django application. I have something similar to this class ``` @namespace('/connect') class ConnectNamespace(BaseNamespace): def on_send(self, data): # ... ``` However, if I receive the events from the javascript client, everything works and for instance `send` event is processed correctly I'm a little bit lost if I want to `emit` some event on the server side. I can do it inside the class with `socket.send_packet` But now I want to link some event to `post_save` signal, so I'd like to `send_packet` from outside this namespace class, one way of doing this would be ``` ConnectNamespaceInstance.on_third_event('someeventname') ``` I just can't figure out how can I get the instance of ConnectNamespaceInstance To sum it up, I just want to send an event to javascript client after I receive `post_save` signal

Original source

Related problems