Daphne + Channels v3部署启动报RuntimeError: no running event loop求助
问题根因
该报错由asgiref==3.4.1的兼容性问题触发:此版本在模块导入阶段就会尝试获取当前运行的事件循环,而Daphne的加载逻辑是先导入ASGI应用、再初始化启动事件循环,导入阶段不存在运行中的事件循环,因此抛出RuntimeError。
解决方案
方案1:降级asgiref到兼容版本(最适配当前依赖组合)
直接将asgiref降级到3.3.4版本,该版本无导入阶段获取事件循环的逻辑,完全适配你当前使用的Django 2.2、Channels 3.0.4版本:
- 执行降级命令:
pip install asgiref==3.3.4
- 在依赖声明文件(如requirements.txt)中锁定版本,避免后续被自动升级:
asgiref==3.3.4
- 重启daphne服务生效:
systemctl restart daphne
方案2:升级Channels到兼容高版本asgiref的版本
如果不想降级asgiref,可以将Channels升级到3.0.5及以上版本,该版本修复了和asgiref 3.4+的兼容性问题,同时兼容Django 2.2:
pip install channels==3.0.5
升级完成后重启daphne服务即可。
额外修正:调整asgi.py导入顺序
你当前的asgi.py导入顺序存在错误,必须先完成Django环境初始化,再导入Channels相关依赖,否则也可能触发未知加载异常,修正后的asgi.py内容如下:
import os import django # 优先初始化Django环境 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "portal.settings") django.setup() # 初始化完成后再导入Channels及业务相关模块 from channels.http import AsgiHandler from channels.routing import ProtocolTypeRouter, URLRouter, ChannelNameRouter from api.routing import websocket_urlpatterns from channels.auth import AuthMiddlewareStack from api.consumers import MultiplexConsumer application = ProtocolTypeRouter({ "http": AsgiHandler(), "websocket": AuthMiddlewareStack( URLRouter( websocket_urlpatterns ) ), })
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

