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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:05:20