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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:20:13