Django WebSockets 实现

3
我刚开始接触Python和Django,试图在Django中实现Websockets。我正在按照websockets documentation中描述的步骤进行操作。问题是服务器端命令必须在控制台中运行。当我从控制台运行它时,它可以工作,但是我想在Django视图中异步地使用GET请求运行它。当我尝试运行时,服务器会引发异常,类似于这样的异常:RuntimeError: There is no current event loop in thread 'Thread-2'
更具体地说,我想使用该技术显示实时日志。例如,Oracle过程执行插入并将其推送到带有Websockets的页面。
我是否在错误的路径上实现了所述内容,或者有人能够建议正确/更好的解决方案吗?

我正在使用Django版本1.9,在Django开发服务器和Uwsgi和Nginx服务器上实现,RedHatEnterpriseServer Release: 6.7上的Python版本为3.5.2。


更新
我将以上URL中的确切代码放在了视图中。

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文档示例。

你能展示一下你尝试过的吗? - juankysmith
@juankysmith 请查看更新。 - arminrock
2个回答

1

Django的请求/响应循环是严格同步的。在正常的Django视图中,您要尝试做的事情是不可能的。

您可能会对Django Channels感兴趣,这是一个旨在消除此限制的项目。


1
你不能真正这样做。我无法说为什么你会得到精确的错误,但是对于Django视图的GET请求需要在一定时间内返回响应,而不是永远运行,否则浏览器(或其他中间件如Nginx)将把非响应视为超时。如果你想运行一个websocket服务器,请在Django之外的单独进程中进行。

有许多正在进行的工作以添加异步功能和Websockets到Django中,这些工作以channels的形式存在 - 我认为http://channels.readthedocs.io/en/latest/文档是目前可用的最新版本代码; 希望它将成为Django 1.10的一部分。当前版本应该可以作为Django应用程序使用,允许你在Django中制作Websockets,但它并不像你上面尝试的那么容易。


请注意,Channels在1.10中将不会出现,但在可预见的未来将作为单独的应用程序存在。但这并不应该阻止您使用它! - knbk
在得到答案后,我开始阅读和学习“通道”概念和实现。感谢反馈。 - arminrock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接