Django Channels部署执行daphne触发AppRegistryNotReady错误求助
解决方案
从报错堆栈可以明确:ASGI启动流程中,Django应用注册表尚未完成初始化,就提前导入了模型相关代码(路径:asgi.py→chats/routing.py→chats/consumers.py→chats/models.py→accounts/models.py),触发了AppRegistryNotReady错误。以下是针对性修复方案:
1. 修正ASGI文件的初始化顺序
确保在导入任何应用模块前,先完成Django的核心初始化。修改MarketPlace/asgi.py:
import os import django from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application # 先配置并初始化Django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MarketPlace.settings') django.setup() # 初始化完成后再导入路由模块 from chats.routing import websocket_urlpatterns application = ProtocolTypeRouter({ "http": get_asgi_application(), "websocket": URLRouter(websocket_urlpatterns), })
2. 延迟消费者中的模型导入
不在消费者文件顶部直接导入模型,而是在需要使用的方法内部动态导入。修改chats/consumers.py:
# 移除顶部的 from .models import Conversation, Message class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): # 在方法内按需导入模型 from .models import Conversation # 后续业务逻辑... async def receive(self, text_data): from .models import Message # 后续业务逻辑...
3. 用字符串引用消费者(避免路由提前加载)
在chats/routing.py中,以字符串路径形式引用消费者,而非直接导入:
from django.urls import path websocket_urlpatterns = [ path('ws/chat/<int:room_id>/', 'chats.consumers.ChatConsumer'), ]
4. 优化模型对自定义User的引用
所有关联User模型的场景,使用settings.AUTH_USER_MODEL替代直接导入,规避循环导入风险。修改chats/models.py:
from django.conf import settings from django.db import models class Conversation(models.Model): participants = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='conversations') # 其他字段... class Message(models.Model): sender = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) # 其他字段...
内容的提问来源于stack exchange,提问作者Siyabonga Vincent
相关产品推荐
相关产品推荐

