You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本:

  1. 执行降级命令:
pip install asgiref==3.3.4
  1. 在依赖声明文件(如requirements.txt)中锁定版本,避免后续被自动升级:
asgiref==3.3.4
  1. 重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:30:04