如何在Celery Worker中修改Django的PostgreSQL数据库对象?
解决Celery Worker无法访问Django PostgreSQL数据库的问题
你的核心问题是Celery Worker没有正确初始化Django运行环境,导致无法连接并操作数据库。以下是具体的修正步骤:
1. 重构Celery全局配置
不要在app的task.py中重复创建Celery实例,而是在Django项目根目录创建celery.py统一配置:
import os from celery import Celery # 强制设置Django环境变量,让Celery识别项目配置 os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名称.settings') app = Celery('你的项目名称') # 从settings.py加载Celery配置(自动识别带CELERY_前缀的配置项) app.config_from_object('django.conf:settings', namespace='CELERY') # 自动发现所有app中的tasks.py文件 app.autodiscover_tasks()
2. 修改app的task.py,移除无效配置
删除task.py中多余的Celery实例创建代码,确保任务依赖Django环境:
from celery import shared_task from celery_progress.backend import ProgressRecorder from .models import Task from time import sleep @shared_task(bind=True) def rephrase_task(self, primary_key): print('ID Worker ' + self.request.id) # 先确认对象存在,避免因主键无效导致无更新动作 task = Task.objects.filter(pk=primary_key).first() if task: task.TaskId = str(self.request.id) task.save() # 或者保持update写法:Task.objects.filter(pk=primary_key).update(TaskId=str(self.request.id)) progress_recorder = ProgressRecorder(self) for i in range(1, 101): sleep(1) progress_recorder.set_progress(i, 100) return 1
3. 正确启动Celery Worker
在项目根目录下执行启动命令,确保Worker加载Django环境:
celery -A 你的项目名称 worker -l info
额外排查点
- 查看Celery Worker日志,检查是否有数据库连接错误(如权限不足、地址错误)
- 在
rephrase_task中添加调试代码,比如print(Task.objects.count()),验证是否能正常读取数据库
内容的提问来源于stack exchange,提问作者NicoCaldo
相关产品推荐
相关产品推荐

