Django improperyconfigured-密钥设置不能为空

2024-04-29 20:43:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用芹菜运行一个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.

在mysettings.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)中使完全相同的导入也可以正常运行。

为什么会发生这种错误?

编辑:这是我的芹菜.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)

Tags: 文件djangokeyfrompyimportapp应用程序
2条回答

该问题是由于将芹菜任务导入到设置文件中以便将其传递到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

如果芹菜不知道在哪里查找您的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

相关问题 更多 >