From dea3454011f242bc82ae34b016101984854ee517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Sun, 31 Aug 2025 01:25:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DDjango=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=B6=E7=9A=84=E5=AF=BC=E5=85=A5=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在knowledge/apps.py的ready()方法中注册Celery任务 - 移除ops/__init__.py中的直接导入,避免循环依赖 - 简化tasks/__init__.py,使用延迟导入 - 解决"Apps aren't loaded yet"错误 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- apps/knowledge/apps.py | 33 ++++++++++++++++++++++++++++++++ apps/knowledge/tasks/__init__.py | 5 ++--- apps/ops/__init__.py | 25 ++---------------------- 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/apps/knowledge/apps.py b/apps/knowledge/apps.py index cd703220..4f1473de 100644 --- a/apps/knowledge/apps.py +++ b/apps/knowledge/apps.py @@ -4,3 +4,36 @@ from django.apps import AppConfig class KnowledgeConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'knowledge' + + def ready(self): + """在Django应用准备好后注册Celery任务""" + try: + # 导入Celery应用 + from ops import celery_app + + # 注册高级学习任务 + try: + from knowledge.tasks.advanced_learning import ( + advanced_learning_by_document, + batch_advanced_learning + ) + celery_app.register_task(advanced_learning_by_document) + celery_app.register_task(batch_advanced_learning) + print("✅ Advanced learning tasks registered via app config") + except ImportError as e: + print(f"❌ Failed to register advanced learning tasks: {e}") + + # 注册媒体学习任务 + try: + from knowledge.tasks.media_learning import ( + media_learning_by_document, + media_learning_batch + ) + celery_app.register_task(media_learning_by_document) + celery_app.register_task(media_learning_batch) + print("✅ Media learning tasks registered via app config") + except ImportError as e: + print(f"❌ Failed to register media learning tasks: {e}") + + except Exception as e: + print(f"⚠️ Failed to register tasks via app config: {e}") diff --git a/apps/knowledge/tasks/__init__.py b/apps/knowledge/tasks/__init__.py index f9e603d9..593a8a26 100644 --- a/apps/knowledge/tasks/__init__.py +++ b/apps/knowledge/tasks/__init__.py @@ -1,6 +1,5 @@ # coding=utf-8 # Import tasks for Celery discovery -# Note: We import the specific tasks, not * to avoid circular imports -from .advanced_learning import advanced_learning_by_document, batch_advanced_learning -from .media_learning import media_learning_by_document, media_learning_batch \ No newline at end of file +# Note: We use lazy imports to avoid Django app loading issues +# Tasks will be imported when needed by Celery's autodiscover \ No newline at end of file diff --git a/apps/ops/__init__.py b/apps/ops/__init__.py index df9e301b..407d34db 100644 --- a/apps/ops/__init__.py +++ b/apps/ops/__init__.py @@ -8,26 +8,5 @@ """ from .celery import app as celery_app -# Import and register advanced learning tasks -try: - from knowledge.tasks.advanced_learning import ( - advanced_learning_by_document, - batch_advanced_learning - ) - # Register tasks with the celery app - celery_app.register_task(advanced_learning_by_document) - celery_app.register_task(batch_advanced_learning) -except ImportError: - pass - -# Import and register media learning tasks -try: - from knowledge.tasks.media_learning import ( - media_learning_by_document, - media_learning_batch - ) - # Register tasks with the celery app - celery_app.register_task(media_learning_by_document) - celery_app.register_task(media_learning_batch) -except ImportError: - pass +# 任务注册现在通过knowledge/apps.py的ready()方法处理 +# 这样可以避免Django应用未准备好时的导入问题