如何将Django外部settings.py中的broker_url传递给Celery服务
问题根源
你的Celery实例运行时加载的Django配置是项目根目录下的默认mydjangoproject.settings,没有加载/etc/opt/mydjangoproject/路径下的自定义配置文件,所以上下文中不存在RABBITMQ_BROKER变量。Django能正常读取是因为你启动Django服务时已经指定了自定义配置路径、且将/etc/opt加入了Python模块搜索路径,Celery侧没有做对应的配置。
另外注意你给出的/etc/opt/mydjangoproject/settings.py里存在拼写错误:from mydangoproject.settings import * 中项目名少了字符j,应为mydjangoproject,先修正这个笔误。
修复步骤
1. 避免配置命名冲突
将/etc/opt/mydjangoproject/settings.py重命名为/etc/opt/mydjangoproject/prod_settings.py,防止和项目根目录下的同名配置文件加载冲突。
2. 调整Celery启动的环境变量
命令行临时启动场景
执行Celery启动命令前,先设置两个环境变量:
# 把自定义配置路径加入Python搜索路径 export PYTHONPATH="${PYTHONPATH}:/etc/opt" # 指定Django加载自定义配置 export DJANGO_SETTINGS_MODULE="mydjangoproject.prod_settings"
再执行原有Celery启动命令即可正常读取变量。
systemd服务启动场景
编辑/etc/conf.d/celery文件,在末尾追加两行配置:
PYTHONPATH=/etc/opt:/opt/mydjangoproject DJANGO_SETTINGS_MODULE=mydjangoproject.prod_settings
保存后执行以下命令重载配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart celery
可选:硬编码配置路径(不推荐但更简单)
如果不想用环境变量配置,可以直接修改项目根目录下的celery.py,手动添加搜索路径并指定配置模块:
import os import sys from celery import Celery # 加自定义配置路径到Python搜索路径 sys.path.append('/etc/opt') # 指定加载自定义生产配置 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjangoproject.prod_settings') app = Celery('mydjangoproject') default_config = 'mydjangoproject.celery_config' app.config_from_object(default_config) app.autodiscover_tasks()
内容的提问来源于stack exchange,提问作者Radial
相关产品推荐
相关产品推荐

