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

学校项目中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属性,因此触发错误。

修复步骤

  1. 修正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',)
    
  2. 验证Celery启动命令:
    启动Worker时必须指定正确的应用模块:
    celery -A proyecto worker --loglevel=info
    
    -A proyecto参数告诉Celery加载proyecto.celery模块并使用其中的app实例。
  3. 检查Docker容器内的Python路径:
    确保项目根目录在容器的PYTHONPATH中,保证proyecto模块能被Python正确导入。

内容的提问来源于stack exchange,提问作者elordenador

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 21:47:26