Как отправить уведомление с сервера (django) клиенту (socketio)?

Я хочу отправить сообщение с сервера клиенту. Я посмотрел на это, но не могу использовать, потому что не могу создать экземпляр пространства имен. Как генерировать событие SocketIO на стороне сервера

Мой вариант использования: у меня есть база данных о цене продукта. Многие пользователи в настоящее время просматривают мой сайт. Некоторые из них просматривают товар X. На стороне сервера админ может редактировать цену товара. Если он отредактирует цену X, все клиенты должны увидеть уведомление об изменении цены X (например, простое оповещение js).

Мой клиентский javascript сейчас:

var socket = io.connect('/product');
#notify server that this client is viewing product X
socket.emit("join", current_product.id);

#upon receive msg from server
socket.on('notification', function (data) {
    alert("Price change"); 
}); 

Код моего сервера (socket.py):

@namespace('/products')
class ProductsNamespace(BaseNamespace, ProductSubscriberMixin):
def initialize(self, *args, **kwargs):
    _connections[id(self)] = self
    super(ProductsNamespace, self).initialize(*args, **kwargs)

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

def on_join(self, *args):
    print "joining"

def emit_to_subscribers(self): pass

Я использую runserver_socketio.py, как в этой ссылке. (Спасибо Кэлвину Ченгу за этот отличный современный пример.)

Я не знаю, как вызвать функцию emit_to_subscribers. Поскольку у меня нет экземпляра пространства имен. Как я прочитал из этого doc ,

Пространства имен создаются только тогда, когда приходят некоторые пакеты, запрашивающие пространство имен.

Но как я могу отправить пакет в это пространство имен из кода? ЕСЛИ я могу создать экземпляр только тогда, когда клиент отправляет сообщение на сервер, когда никто не просматривает сайт, сразу после завершения редактирования цены система выйдет из строя.

Я действительно запутался в пространстве имен и его экземпляре. Если у вас есть более четкие документы, пожалуйста, помогите мне.

Большое спасибо!


person Kristine T    schedule 01.11.2013    source источник
comment
У меня есть грязный обходной путь для этого. По-прежнему используйте словарь _connections, чтобы отслеживать текущее соединение. Затем используйте _connections.items()[0][1].emit_to_subscribers().   -  person Kristine T    schedule 01.11.2013


Ответы (1)


Это мое текущее состояние понимания, надеюсь, это будет кому-то полезно. Дальнейшее развитие из Как генерировать событие SocketIO на стороне сервера , теперь у вас есть словарь с ProductsNamespace объектами в качестве значений. Вы можете перебирать этот словарь, чтобы найти нужный объект сокета. Например, если вы устанавливаете идентификатор сокета при подключении, как описано в примерах приложений Django и Flask, используя метод on_nickname, вы можете получить сокет следующим образом:

for key in _connections:
    socket = _connections[key]
    if 'nickname' in socket.session and socket.session['nickname'] == unicode('uniqueName'):
        socket.emit('eventTag', 'message from server')

Точно так же socket.session['rooms'] можно использовать для передачи всем членам комнаты, а если имеется несколько пространств имен SocketIO, можно использовать socket.ns_name.

person user2588    schedule 22.11.2013