2013-11-01 91 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,只讀當一些數據包到達時問命名空間

命名空間創建。

但是我怎樣才能從代碼發送數據包到該命名空間?如果我只能在客戶端向服務器發送消息時創建實例,當沒有人正在瀏覽網站時,在完成編輯價格後,系統將會失敗。

我對命名空間及其實例非常困惑。如果你有更清晰的文檔,請幫助我。

非常感謝!

+0

我對此有一個骯髒的解決方法。仍然使用_connections字典來跟蹤當前的連接。然後使用_connections.items()[0] [1] .emit_to_subscribers()。 –

回答

0

這是我目前的理解狀態,希望對某人有幫助。建立從How to emit SocketIO event on the serverside進一步,你現在有一個字典ProductsNamespace對象值。你可以迭代這個字典來找到想要的套接字對象。例如,如果你在連接設置套接字標識符,如通過使用on_nickname方法在Django和瓶示例應用程序所描述的,然後可以檢索插座像這樣:

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

相關問題