Django websockets 实现

Posted

技术标签:

【中文标题】Django websockets 实现【英文标题】:Django websockets implementation 【发布时间】:2016-07-07 07:18:10 【问题描述】:

我是 python 和 Django 的新手,我正在尝试在 Django 中实现 websockets。 我要做的是按照websockets documentation 中描述的步骤 问题是所描述的服务器端命令必须在控制台中运行。当我从控制台运行它时它可以工作,但我想在 Django 视图中使用GET 请求异步运行它。当我尝试它时,服务器会引发类似RuntimeError: There is no current event loop in thread 'Thread-2' 的异常。 更具体地说,我想使用该技术来显示实时日志。例如,oracle 程序执行插入,服务器将其推送到带有 websockets 的页面。 我在实施所描述的道路上是否走错了路,或者任何人都可以提出正确/更好的解决方案吗? 我在 Django 的开发服务器和 Uwsgi 和 nginx 服务器上实现的 django 版本 1.9,RedHatEnterpriseServer 上的 python 版本 3.5.2 版本:6.7

更新 上面 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 请查看更新。 【参考方案1】:

Django 的请求/响应周期是严格同步的。在普通的 Django 视图中,您尝试做的事情是不可能的。

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

【讨论】:

【参考方案2】:

你真的不能这样做。我不能说你为什么会得到你得到的确切错误,但是对 Django 视图的 GET 请求需要在一段时间后返回响应,而不是永远运行,否则浏览器(或介于两者之间的其他部分就像Nginx)会将无响应视为超时。如果要运行 websocket 服务器,请在 Django 之外的单独进程中执行。

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

【讨论】:

请注意,Channels will not be 在 1.10 中,但在可预见的未来将作为一个单独的应用程序存在。不过,这不应该阻止你使用它! 得到答案后,我开始阅读和学习channles 的概念和实现。感谢您的反馈

以上是关于Django websockets 实现的主要内容,如果未能解决你的问题,请参考以下文章

Django 频道实时聊天保存发送的消息

Go语言实现WebSocket协议

springboot整合websocket

WebSocket 实战

(转)WebSocket学习

websocket和websocket++和websocketpp都是啥,有啥关系呢