【问题标题】:Django ImproperlyConfigured - The SECRET_KEY setting must not be emptyDjango ImproperlyConfigured - SECRET_KEY 设置不能为空
【发布时间】:2016-01-12 05:48:57
【问题描述】:

我正在使用 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 文件中注释导入,应用程序运行良好:

# 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)

【问题讨论】:

  • 你设置DJANGO_SETTINGS_MODULE环境变量了吗?
  • 是的,在manage.py中设置了os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")
  • 你使用的是哪个 Django 版本?
  • 很可能是循环导入某处的结果。如果没有您的整个代码库,很难准确地判断出哪里。
  • 可能是您在设置文件中导入某些内容,导致设置文件被导入作为回报? (循环导入)

标签: python django celery


【解决方案1】:

问题是由于将 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

【讨论】:

    【解决方案2】:

    如果 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 文件更新了我的问题,它看起来和你建议的一样。我仍然遇到同样的错误
    • 好的,我明白了。您的代码中有myproj.settingshub.settings 的组合。这是一个错误,还是只是一个不完全匿名的代码?
    • 对不起,只是一个错字。更新了问题
    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 2017-06-04
    • 2020-01-15
    • 2013-10-08
    • 2016-12-25
    • 1970-01-01
    • 2017-10-03
    • 2015-06-09
    相关资源
    最近更新 更多