学校项目中Django整合Celery报错:无user_options属性
Django + Celery + Docker Swarm 部署问题:AttributeError: module 'proyecto.celery' has no attribute 'user_options'
在学校网站项目中用Django整合Celery,部署到Docker Swarm环境,Redis连接正常,但Celery运行时触发AttributeError: module 'proyecto.celery' has no attribute 'user_options'错误,导致任务无法执行。以下是报错日志和celery.py配置代码:
报错日志
mvc_worker.1.0loi6eqoh98b@docker-6 | worker: Warm shutdown (MainProcess) mvc_worker.2.n430upc71wra@docker-6 | mvc_worker.2.n430upc71wra@docker-6 | -------------- celery@b36996e0b059 v5.6.2 (recovery) mvc_worker.2.n430upc71wra@docker-6 | --- ***** ----- mvc_worker.2.n430upc71wra@docker-6 | -- ******* ---- Linux-6.12.74+deb13+1-amd64-x86_64-with-musl1 2026-05-05 12:06:06 mvc_worker.2.n430upc71wra@docker-6 | - *** --- * --- mvc_worker.2.n430upc71wra@docker-6 | - ** ---------- [config] mvc_worker.2.n430upc71wra@docker-6 | - ** ---------- .> app: proyecto:0x7fa79ae41d30 mvc_worker.2.n430upc71wra@docker-6 | - ** ---------- .> transport: redis://redis:6379/0 mvc_worker.2.n430upc71wra@docker-6 | - ** ---------- .> results: redis://redis:6379/0 mvc_worker.2.n430upc71wra@docker-6 | - *** --- * --- .> concurrency: 2 (prefork) mvc_worker.2.n430upc71wra@docker-6 | -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) mvc_worker.2.n430upc71wra@docker-6 | --- ***** ----- mvc_worker.2.n430upc71wra@docker-6 | -------------- [queues] mvc_worker.2.n430upc71wra@docker-6 | .> celery exchange=celery(direct) key=celery mvc_worker.2.n430upc71wra@docker-6 | mvc_worker.2.n430upc71wra@docker-6 | mvc_worker.2.n430upc71wra@docker-6 | [tasks] mvc_worker.2.n430upc71wra@docker-6 | . tienda.tasks.enviar_correo_bienvenida mvc_worker.2.n430upc71wra@docker-6 | . tienda.tasks.enviar_correo_confirmacion mvc_worker.2.n430upc71wra@docker-6 | . tienda.tasks.enviar_correo_recuperacion mvc_worker.2.n430upc71wra@docker-6 | . tienda.tasks.process_purchase mvc_worker.2.n430upc71wra@docker-6 | mvc_worker.2.n430upc71wra@docker-6 | [2026-05-05 12:06:06,950: INFO/MainProcess] Connected to redis://redis:6379/0 mvc_worker.2.n430upc71wra@docker-6 | [2026-05-05 12:06:06,961: INFO/MainProcess] mingle: searching for neighbors mvc_worker.2.n430upc71wra@docker-6 | [2026-05-05 12:06:07,992: INFO/MainProcess] mingle: all alone mvc_worker.2.n430upc71wra@docker-6 | [2026-05-05 12:06:08,066: INFO/MainProcess] celery@b36996e0b059 ready. mvc_worker.2.ks7d5niodjfq@docker-4 | ^^^^^^^^^^^^^^^^^^^^^^^^ mvc_worker.2.ks7d5niodjfq@docker-4 | AttributeError: module 'proyecto.celery' has no attribute 'user_options' mvc_worker.1.m5xkx8xasgww@docker-6 | Traceback (most recent call last): mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/bin/celery", line 6, in <module> mvc_worker.1.m5xkx8xasgww@docker-6 | sys.exit(main()) mvc_worker.1.m5xkx8xasgww@docker-6 | ~~~~^^ mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/celery/__main__.py", line 15, in main mvc_worker.1.m5xkx8xasgww@docker-6 | sys.exit(_main()) mvc_worker.1.m5xkx8xasgww@docker-6 | ~~~~~^^ mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/celery/bin/celery.py", line 227, in main mvc_worker.1.m5xkx8xasgww@docker-6 | return celery(auto_envvar_prefix="CELERY") mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/click/core.py", line 1485, in __call__ mvc_worker.1.m5xkx8xasgww@docker-6 | return self.main(*args, **kwargs) mvc_worker.1.m5xkx8xasgww@docker-6 | ~~~~~~~~~^^^^^^^^^^^^^^^^^ mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/click/core.py", line 1406, in main mvc_worker.1.m5xkx8xasgww@docker-6 | rv = self.invoke(ctx) mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/click/core.py", line 1870, in invoke mvc_worker.1.m5xkx8xasgww@docker-6 | super().invoke(ctx) mvc_worker.1.m5xkx8xasgww@docker-6 | ~~~~~~~~~~~~~~^^^^^ mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/click/core.py", line 1269, in invoke mvc_worker.1.m5xkx8xasgww@docker-6 | return ctx.invoke(self.callback, **ctx.params) mvc_worker.1.m5xkx8xasgww@docker-6 | ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/click/core.py", line 824, in invoke mvc_worker.1.m5xkx8xasgww@docker-6 | return callback(*args, **kwargs) mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/click/decorators.py", line 34, in new_func mvc_worker.1.m5xkx8xasgww@docker-6 | return f(get_current_context(), *args, **kwargs) mvc_worker.1.m5xkx8xasgww@docker-6 | File "/usr/local/lib/python3.14/site-packages/celery/bin/celery.py", line 158, in celery mvc_worker.1.m5xkx8xasgww@docker-6 | worker.params.extend(ctx.obj.app.user_options.get('worker', [])) mvc_worker.1.m5xkx8xasgww@docker-6 | ^^^^^^^^^^^^^^^^^^^^^^^^ mvc_worker.1.m5xkx8xasgww@docker-6 | AttributeError: module 'proyecto.celery' has no attribute 'user_options'
celery.py配置代码
from celery import Celery import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proyecto.settings') django.setup() app = Celery('proyecto') app.config_from_object('django.conf:settings', namespace="CELERY") app.user_options = {} app.autodiscover_tasks()
问题原因与修复方案
核心原因
Celery CLI尝试访问ctx.obj.app.user_options时,错误地将proyecto.celery模块本身当作了Celery应用对象,而非模块内部定义的app实例。模块本身没有user_options属性,因此触发错误。
修复步骤
- 修正celery.py代码:
移除手动添加的app.user_options = {}(Celery会自动初始化该属性),并确保模块导出app实例:from celery import Celery import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proyecto.settings') django.setup() app = Celery('proyecto') app.config_from_object('django.conf:settings', namespace="CELERY") app.autodiscover_tasks() # 明确导出app对象,确保Celery能正确识别 __all__ = ('app',) - 验证Celery启动命令:
启动Worker时必须指定正确的应用模块:celery -A proyecto worker --loglevel=info-A proyecto参数告诉Celery加载proyecto.celery模块并使用其中的app实例。 - 检查Docker容器内的Python路径:
确保项目根目录在容器的PYTHONPATH中,保证proyecto模块能被Python正确导入。
内容的提问来源于stack exchange,提问作者elordenador
相关产品推荐
相关产品推荐

