Skip to main content
 首页 » 编程设计

python之Django websockets 实现

2024年10月17日37yjmyzz

我是 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 感兴趣,一个旨在消除此限制的项目。