2016-07-07 115 views
1

我是新來的python和Django,我試圖在Django中實現websockets。
我所做的是我按照websockets documentation
中描述的步驟問題是所描述的服務器端命令必須在控制檯中運行。當我從控制檯運行它,它的工作原理,但我想在GET請求異步運行它在Django視圖內。當我嘗試它時,服務器引發了一個異常,如RuntimeError: There is no current event loop in thread 'Thread-2'
更具體地說,我想使用該技術來顯示實時日誌。例如,一個oracle過程執行一個插入,並且服務器將它推入帶有websockets的頁面。
我在實施描述的錯誤路徑或任何人都可以提出一個正確/更好的解決方案?

我在這兩個Django的開發服務器和Uwsgi和Nginx的服務器上實現Django的版本1.9,Python版本3.5.2上RedHatEnterpriseServer版本:6.7Django websockets實現


UPDATE
從上面的網址和我的確切代碼把它放在視圖中。

def ws(request): 

    async def time(websocket, path): 
     while True: 
      now = datetime.datetime.utcnow().isoformat() + 'Z' 
      await websocket.send(now) 
      await asyncio.sleep(random.random() * 3) 

    start_server = websockets.serve(time, '192.168.4.177', 9876) 

    asyncio.get_event_loop().run_until_complete(start_server) 
    asyncio.get_event_loop().run_forever() 

return render(request,"ws.html") 

當通過該視圖處理URL時,會發生上述錯誤。

ws.html是從上面提到的WebSockets文檔例如精確副本

+0

你能告訴我們你試過什麼嗎? – juankysmith

+0

@juankysmith請參閱更新。 – arminrock

回答

1

Django的請求/響應循環是嚴格同步。在正常的Django視圖中,你試圖做的事情是不可能的。

您可能會對Django Channels感興趣,該項目旨在消除此限制。

1

你不能這樣做。我不能說你爲什麼會得到確切的錯誤,但是對Django視圖的GET請求需要在一段有限的時間後返回一個響應,而不是永遠運行,否則瀏覽器(或者其他部分就像Nginx)會將無響應視爲超時。如果你想運行一個websocket服務器,在Django之外的一個單獨的進程中執行它。

有很多正在進行的工作添加異步功能和WebSockets向Django的,在渠道的形式 - 我認爲在http://channels.readthedocs.io/en/latest/的文檔都可以目前已經使用的代碼的最新版本;希望它會成爲Django 1.10的一部分。當前版本應該可以用作Django應用程序,它可以讓你在Django中製作websockets,但是它不像你上面的嘗試那麼簡單。

+0

請注意,頻道[不會](https://groups.google.com/forum/#!topic/django-developers/QRd4v7OErT8)爲1.10,但在可預見的未來將作爲單獨的應用程序生活。不過,這不應該阻止你使用它! – knbk

+0

答案之後,我開始閱讀並學習「channles」的概念和實現。感謝您的反饋 – arminrock