我是 python 和 Django 的新手,我正在尝试在 Django 中实现 websockets。
我所做的是按照 websockets documentation 中描述的步骤进行操作
问题是所描述的服务器端命令必须在控制台中运行。当我从控制台运行它时它可以工作,但我想使用 GET 请求在 Django View 中异步运行它。当我尝试它时,服务器引发类似这样的异常 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 的确切代码,我将其放在 View 中。
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")
当此 View 处理 URL 时,会发生上述错误。
我的 ws.html 是上述 websockets 文档示例的精确副本
请您参考如下方法:
Django 的请求/响应周期是严格同步的。在普通的 Django View 中,您尝试执行的操作是不可能的。
您可能对 Django Channels 感兴趣,一个旨在消除此限制的项目。
