2014-10-07 24 views
2

我剛開始使用Crossbar.io來實現一個實時統計頁面。我已經看了很多代碼示例,但我不知道如何做到這一點:Crossbar.io:如何使用Django服務發佈關於主題的消息?

我有一個Django服務(爲了避免混淆,您可以假設我正在討論視圖中的函數。 py),我希望它在特定主題中發佈消息,只要它被調用。我見過這些方法:(1)Extending ApplicationSession和(2)using an Application instance that is "runned"

它們都不適合我,因爲Django服務不在類的內部,也不作爲獨立的python文件執行,所以我沒有辦法調用「publish」方法(這是我想在服務器端做的唯一事情)。

我試圖讓「StatsBackend」,延伸ApplicationSession的實例,併發布一些信息,但StatsBackend._instance是無總是(甚至當我執行「橫樑開始」和StatsBackend。初始化()是所謂的)。

StatsBackend.py:

from twisted.internet.defer import inlineCallbacks 
from autobahn import wamp 
from autobahn.twisted.wamp import ApplicationSession 

class StatsBackend(ApplicationSession): 

    _instance = None 

    def __init__(self, config): 
     ApplicationSession.__init__(self, config) 
     StatsBackend._instance = self 

    @classmethod 
    def update_stats(cls, amount): 
     if cls._instance: 
      cls._instance.publish('com.xxx.statsupdate', {'amount': amount}) 

    @inlineCallbacks 
    def onJoin(self, details): 
     res = yield self.register(self) 
     print("CampaignStatsBackend: {} procedures registered!".format(len(res))) 

test.py:

import StatsBackend 

StatsBackend.update_stats(100) #Doesn't do anything, StatsBackend._instance is None 
+0

我注意到,當StatsBackend被一個新的Python解釋器加載時,_instance將始終爲None。 – 2014-10-07 18:26:18

回答

6

Django是一個阻塞WSGI應用程序,並且不與AutobahnPython,這是無阻塞很好地融合(上扭曲之上運行或ASYNCIO)。

但是,Crossbar.io有一個內置的REST橋,其中包括一個HTTP Pusher,您可以通過任何支持HTTP/POST的客戶端提交事件。 Crossbar.io會將這些事件轉發給普通的WAMP用戶(例如通過WebSocket實時)。

Crossbar.io還附帶了一個完整的應用程序模板來演示上述功能。嘗試:

cd ~/test1 
crossbar init --template pusher 
crossbar start 

http://localhost:8080打開瀏覽器(打開JS控制檯)和第二終端

curl -H "Content-Type: application/json" \ 
    -d '{"topic": "com.myapp.topic1", "args": ["Hello, world"]}' \ 
    http://127.0.0.1:8080/push 

然後,您可以從做像Django的阻塞應用程序中發佈。

相關問題