2016-07-07 116 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