我正在使用芹菜运行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 文件中评论导入,应用运行正常:
# 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)
答案 0 :(得分: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
答案 1 :(得分:0)
如果Celery不知道在哪里查找Django设置,可能会发生这种情况。尝试在单独的文件中指定芹菜设置:
# 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