2013-11-01 2 views
0

Я хочу передать сообщение от сервера к клиенту. Я смотрю на это, но не могу использовать, потому что я не могу создать экземпляр пространства имен. How to emit SocketIO event on the serversideКак отправить уведомление с сервера (django) клиенту (socketio)?

Мой бланк использования: У меня есть база данных о цене продукта. В настоящее время многие пользователи просматривают мой сайт. Некоторые из них просматривают продукт X. На стороне сервера администратор может отредактировать цену продукта. Если он отредактирует цену X, все клиенты должны увидеть уведомление об изменении цены X (e.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 как в этом link. (Спасибо Calvin Cheng за этот отличный современный пример.)

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

Namespaces создается только тогда, когда некоторые пакеты прибывают, которые просят имена.

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

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

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

+0

У меня есть грязное обходное решение для этого. Все еще используйте словарь _connections, чтобы отслеживать текущее соединение. Затем используйте _connections.items() [0] [1] .emit_to_subscribers(). –

ответ

0

Это мое нынешнее состояние понимания, надеюсь, это будет полезно кому-то. Далее, начиная с How to emit SocketIO event on the serverside, теперь у вас есть словарь с объектами ProductsNamespace. Вы можете выполнить итерацию через этот словарь, чтобы найти нужный объект сокета. Например, если установить идентификатор сокета при соединении, как описано в примерах приложениях Django и колбы с помощью 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.

Смежные вопросы