Docker部署Django聊天应用添加Uvicorn触发AppRegistryNotReady错误
Django + Channels 启动 AppRegistryNotReady 错误解决
问题根源
从错误栈可以明确:启动ASGI服务时,routing.py导入chat.websocket_urls后,链式导入了消费者及模型文件,但此时Django应用注册表尚未加载完成——因为你的routing.py没有执行Django初始化流程,而WSGI服务正常是因为wsgi.py会自动处理初始化。
同时你的asgi.py存在笔误:导入了from chat import urls,但实际使用的是websocket_urls,会导致额外的导入错误。
解决方案
方案1:统一使用ASGI服务(推荐)
Channels的ASGI应用可以同时处理HTTP和WebSocket请求,无需分开启动WSGI和ASGI服务:
- 修正
asgi.py代码:
from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from chat import websocket_urls # 修正导入路径 import os import django # 必须在导入任何Django相关模块前设置环境变量并初始化 os.environ.setdefault("DJANGO_CONFIGURATION", "Local") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "friendly_enigma.settings") django.setup() application = get_asgi_application() application = ProtocolTypeRouter( { "http": application, "websocket": URLRouter(websocket_urls.websocket_urlpatterns) } )
- 修改Dockerfile的启动命令:
CMD gunicorn friendly_enigma.asgi:application -k uvicorn.workers.UvicornWorker --bind=0.0.0.0:8000
方案2:保留双服务启动(不推荐)
如果必须分开运行WSGI和ASGI,需要确保routing.py包含完整的Django初始化流程:
创建/修改friendly_enigma/routing.py:
import os import django # 先完成Django初始化 os.environ.setdefault("DJANGO_CONFIGURATION", "Local") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "friendly_enigma.settings") django.setup() # 初始化完成后再导入路由相关模块 from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from chat import websocket_urls application = get_asgi_application() application = ProtocolTypeRouter( { "http": application, "websocket": URLRouter(websocket_urls.websocket_urlpatterns) } )
关键注意事项
- 所有涉及Django模型、应用配置的导入,必须在
django.setup()执行之后 - 避免在模块顶层直接导入消费者、模型等依赖Django注册表的内容,除非已经完成初始化
内容的提问来源于stack exchange,提问作者Mike D Hovhannisyan
相关产品推荐
相关产品推荐

