我是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
UPDATE
来自上述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文档示例的精确副本
答案 0 :(得分:1)
Django的请求/响应周期是严格同步的。在普通的Django视图中,您尝试做的事情是不可能的。
您可能对Django Channels感兴趣,这是一个旨在消除此限制的项目。
答案 1 :(得分:1)
你真的不能这样做。我不能说你为什么得到你得到的确切错误,但是对Django视图的GET请求需要在一段有限的时间后返回响应,而不是永远运行,否则浏览器(或其他部分之间的类似) Nginx)会将无响应视为超时。如果要运行websocket服务器,请在Django之外的单独进程中执行。
有很多正在进行的工作,以频道的形式向Django添加异步功能和websockets - 我认为http://channels.readthedocs.io/en/latest/的文档是您可以使用的代码的最新版本目前已经使用;希望它将成为Django 1.10的一部分。当前版本应该可用作Django应用程序,允许您在Django中创建websockets,但它并不像您在上面尝试那么容易。