Django ImproperlyConfigured - SECRET_KEY设置不得为空。

5

我正在使用celery运行django应用程序。在我的tasks.py文件中,我遇到了一个奇怪的错误,如下所示:

from __future__ import absolute_import

from celery import shared_task
from django.contrib.auth.models import User

# some code 
# ....

这里是错误信息:
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY must not be empty.

在我的 settings.py 中,已经定义了SECRET_KEY。
# ...
import myproj.tasks
import djcelery

djcelery.setup_loader()

# ...
SECRET_KEY = '18730s9n9sjxamsuJSismxOIAmso102xjAs'
# ...

如果我在tasks.py文件中注释掉import,应用程序就可以正常运行:

# from django.contrib.auth.models import User

更令人惊讶的是,如果我在同一目录下的另一个文件(例如testfile.py)中进行完全相同的导入,它也可以正常运行。

为什么会出现这个错误呢?

编辑:这是我的celery.py文件

from __future__ import absolute_import
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')

from django.conf import settings #noqa

app = Celery('myproj')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

1
很可能是由于某处的循环导入结果。如果没有您的整个代码库,很难确定确切的位置。 - J0HN
无论是调用 celery 还是 manage.py 命令,我都会得到完全相同的结果,例如 celery -A myproj worker -B -l info - Gabriel Ilharco
你能发一下你的 celery.py 文件吗?你在使用 django-celery 吗? - Paulo
我更新了问题并包含了celery.py文件。我正在使用django-celery 3.1.17版本。 - Gabriel Ilharco
1
你是否在设置文件中导入了某些内容,导致设置文件被反过来再次导入?(循环导入) - Paulo
显示剩余8条评论
2个回答

5
问题是将celery任务导入设置文件中以便将它们传递给CELERYBEAT_SCHEDULE设置引起的。
这个导入导致循环导入,因为当任务被导入时,它会加载设置,但只加载到导入任务的那一点,因此抱怨没有配置SECRET_KEY
为了解决这个问题(并作为一般最佳实践),在配置CELERYBEAT_SCHEDULE时使用任务的路径,如下所示:
CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'myapp.tasks.my_task',
        'schedule': timedelta(seconds=30),
        'args': (16, 16)
    },
}

来源 http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#entries

这是有关Celery定期任务的官方文档。Celery是一种分布式任务队列,可通过Python编程语言使用。在该文档中,您可以了解如何设置和运行周期性任务,并查看示例代码。

1
如果Celery不知道在哪里查找您的Django设置,则可能会发生这种情况。尝试在单独的文件中指定celery设置:
# celery.py
from __future__ import absolute_import

import os
from celery import Celery

from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourapp.settings')
app = Celery('yourapp')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

然后将任务标记为:
# tasks.py
from yourapp.celery import app

@app.task()
def yourtask():
    pass

我已经更新了我的问题,并附上了我的celery.py文件,它看起来与您建议的一样。但我仍然遇到相同的错误。 - Gabriel Ilharco
好的,我明白了。你的代码中混合了 myproj.settingshub.settings,这是一个错误还是只是没有完全匿名化的代码? - Alex Morozov
抱歉,那只是一个笔误。已经更新了问题。 - Gabriel Ilharco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接