![](/img/trans.png)
[英]Environment Variables Django: ImproperlyConfigured: The SECRET_KEY setting must not be empty
[英]Django ImproperlyConfigured - The SECRET_KEY setting must not be empty
我正在使用celery運行django應用程序。 我在task.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'
# ...
如果我在task.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)
此問題是由於將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不知道在哪里查找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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.