【问题标题】:Django, Celery Supervisor: Secret Key Error: django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be emptyDjango,Celery Supervisor:密钥错误:django.core.exceptions.ImproperlyConfigured:SECRET_KEY 设置不能为空
【发布时间】:2017-12-11 04:08:37
【问题描述】:

我有一个 django 1.11.4、python3.5、gunicorn 19.7.1 服务器和主管、redis 2.10.6 和 celery 4.1.0。

我的文件结构是这样的:

samy_python
├── celery.py
├── __init__.py
├── settings
├── urls.py
├── wsgi.py
website
├── static
├── templates
├── samy
|    ├── samy_firebase.py
|    ├── tasks.py
├── views.py

我得到了我的秘密:

# settings.py
SECRET_KEY = os.environ.get("secret_KEY")

我的 celery 主管配置文件是:

[program:gunicorn]

....
environment = secret_KEY="12345"
.....

[program:celery]
directory=/home/username/Projects/samy/samy_python
command=/home/username/Projects/samy/samy_python/env/bin/celery --app=samy_python.celery.app worker -B -l info
user=username
stdout_logfile=/var/log/celery/celery.log
stderr_logfile=/var/log/celery/celery.log
autostart=false
autorestart=false
startsecs=10

我的芹菜档案:

# celery.py

from __future__ import absolute_import
import os
import logging
logger = logging.getLogger('myapp.celery.py')

from celery import Celery
from django.conf import settings

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "samy_python.settings")

# Celery App
# TODO
# [START Celery App]
app = Celery('samy_python')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

# [END Celery App]

我的初始化文件:

# __init__.py

from __future__ import absolute_import
from .celery import app as celery_app

我的 celery 的 settings.py 文件中的配置:

BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

错误可能来自我的 settings.py 文件,我使用 env 变量来设置环境。 (生产、开发或测试):

DEBUG = False
DJANGO_TESTING = False
DJANGO_DEVELOPMENT = False
DJANGO_ENV = os.environ.get('DJANGO_ENV')

if DJANGO_ENV == 'DJANGO_TESTING':
    DJANGO_TESTING = True
elif DJANGO_ENV == 'DJANGO_DEVELOPMENT':
    DJANGO_DEVELOPMENT = True

然后我设置 firebase 凭据和 Google Api 凭据。然后我从内部获取凭据,例如 samy_firebase.py:

from django.conf import settings
if settings.DJANGO_TESTING == True:
    logger.info('Firebase Config: Test DB')

我不确定最后一部分是否相关,但这是我不断收到的错误:

   Traceback (most recent call last):
  File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/kombu/utils/objects.py", line 42, in __get__
    return obj.__dict__[self.__name__]
KeyError: 'data'

During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "/home/dorian/Projects/samy/samy_python/env/bin/celery", line 11, in <module>
        sys.exit(main())
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/__main__.py", line 14, in main
        _main()
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/celery.py", line 326, in main
        cmd.execute_from_commandline(argv)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/celery.py", line 488, in execute_from_commandline
        super(CeleryCommand, self).execute_from_commandline(argv)))
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/base.py", line 281, in execute_from_commandline
        return self.handle_argv(self.prog_name, argv[1:])
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/celery.py", line 480, in handle_argv
        return self.execute(command, argv)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/celery.py", line 412, in execute
        ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/worker.py", line 219, in run_from_argv
        *self.parse_options(prog_name, argv, command))
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/base.py", line 403, in parse_options
        self.parser = self.create_parser(prog_name, command)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/base.py", line 419, in create_parser
        self.add_arguments(parser)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/bin/worker.py", line 275, in add_arguments
        default=conf.worker_state_db,
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/utils/collections.py", line 130, in __getattr__
        return self[k]
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/utils/collections.py", line 431, in __getitem__
        return getitem(k)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/utils/collections.py", line 280, in __getitem__
        return mapping[_key]
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/collections/__init__.py", line 982, in __getitem__
        if key in self.data:
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/kombu/utils/objects.py", line 44, in __get__
        value = obj.__dict__[self.__name__] = self.__get(obj)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/app/base.py", line 148, in data
        return self.callback()
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/app/base.py", line 911, in _finalize_pending_conf
        conf = self._conf = self._load_config()
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/app/base.py", line 921, in _load_config
        self.loader.config_from_object(self._config_source)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/loaders/base.py", line 133, in config_from_object
        self._conf = force_mapping(obj)
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/celery/utils/collections.py", line 50, in force_mapping
        if isinstance(m, (LazyObject, LazySettings)):
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/django/utils/functional.py", line 238, in inner
        self._setup()
      File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/django/conf/__init__.py", line 41, in _setup
        self._wrapped = Settings(settings_module)
File "/home/dorian/Projects/samy/samy_python/env/lib/python3.5/site-packages/django/conf/__init__.py", line 129, in __init__
    raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

另外,gunicorn 工作得很好,所以如果我不启动 celery 程序,它会接收环境变量。此外,如果我在 settings.py 文件中将密钥设置为“12345”,它就会启动。

【问题讨论】:

  • 您是否检查过是否设置了密钥 env var?也许在终端中尝试 echo $secret_KEY。
  • 那是空的。对不起,我以为我是在主管程序中设置 env 变量?我是否是root也有关系吗?我在 root 中运行 supervisorctl

标签: python django redis celery


【解决方案1】:

像这样在 env 中设置 secret_KEY:

export SECRET_KEY="#mysecret_key"

然后检查:

echo $SECRET_KEY

在您的 django 设置中,更改为:

SECRET_KEY = os.environ.get("SECRET_KEY")

详细参考检查:Read and Set Environment Variables

【讨论】:

  • 我可以从我的主管配置文件中删除 environment = secret_KEY 吗?如果我重新启动服务器或 Web 应用程序崩溃,我是否需要再次设置?
  • 是的,您可以删除它。
【解决方案2】:

将环境变量添加到主管配置文件的[program:celery] 部分。目前只为gunicorn设置。

【讨论】:

  • 嘿,谢谢安德鲁。在做了很多阅读之后,我意识到它没有共享。 idk,出于某种原因,我认为如果 gunicorn 先启动并且该环境正在运行,那么芹菜就会“加入”。我最终输入了密钥,但随后意识到我需要所有 env 密钥。即braintree、google、firebase等......所以现在我想我会从一个json文件中读取。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2017-06-04
相关资源
最近更新 更多