Django 和 celery:为 'celery' 程序设置 DJANGO_SETTINGS_MODULE 需要什么,因为它已经在 manage.py 中设置

Django and celery: What is the need for setting DJANGO_SETTINGS_MODULE for the 'celery' program since its already set in manage.py

当我了解如何使用 celery 时,我发现了以下内容

import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
app = Celery('projectname')

在上面的代码中我们设置了环境变量DJANGO_SETTINGS_MODULE

这与我们在 manage.py

中所做的相同
def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')

因为 DJANGO_SETTINGS_MODULE 它被设置在 manage.py 为什么要在 celery 中再次设置它

我检查过 DJANGO_SETTINGS_MODULE 已经设置。我注释掉并打印了环境变量:

import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')

print("DJANGO_SETTINGS_MODULE [celery.py] : ",os.environ.get("DJANGO_SETTINGS_MODULE"))

app = Celery('projectname')

然后

$ python manage.py runserver

输出:

DJANGO_SETTINGS_MODULE [celery.py] :  projectname.settings

所以我觉得不需要。

我们将 DJANGO_SETTINGS_MODULE 环境变量的默认值设置为 python 设置文件的路径。 Django 使用这个环境变量来定义它应该加载哪个设置文件,它允许我们使用我们想要在相应文件中使用的 from django.conf import settings 导入设置。

在 Django 应用程序中 celery.py 再次定义它的目的是因为 celery 运行 作为一个单独的服务,而我们的 django 服务器 运行 是分开的。

希望对您有所帮助,解开您的疑惑!!!

这样 celery 就可以自动发现您的应用程序模块中的任务。 Celery 不是以 manage.py 开始的,它的开始类似于下面的

$ celery -A proj worker -l info

当此命令在 shell 中为 运行 时,Celery 执行 proj/celery.py 中的代码,导出 Django 设置并在项目应用程序中查找 tasks.py