【发布时间】:2018-05-14 18:21:32
【问题描述】:
我的 Django 项目有多个用于开发、生产和测试的设置文件。我正在使用主管来管理芹菜工人。我的问题是如何根据我所处的环境加载 celery 的设置文件。
【问题讨论】:
我的 Django 项目有多个用于开发、生产和测试的设置文件。我正在使用主管来管理芹菜工人。我的问题是如何根据我所处的环境加载 celery 的设置文件。
【问题讨论】:
通过使用环境变量。假设您在存储库的根目录中有以下设置文件。
config.settings.development.pyconfig.settings.production.pyThe recommended way 定义您的 celery 实例在您的配置中,例如 celery.py 模块:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production')
app = Celery('proj')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
不要在模块中设置 DJANGO_SETTINGS_MODULE 变量(我已将其注释掉),请确保在启动 supervisord 时环境中存在这些变量。
要在暂存、测试和生产系统中设置这些变量,您可以执行以下 bash 命令。
例如在您的生产系统上:
$ export DJANGO_SETTINGS_MODULE=config.settings.production
$ echo $DJANGO_SETTINGS_MODULE
我还建议您从.env 文件中加载它们。在我看来那更方便。例如,您可以使用 python-dotenv。
更新
.env 文件在您的不同系统上大多是唯一的,并且通常不受源代码/版本控制。唯一我的意思是对于开发,您可能有更详细的LOG_LEVEL 或不同的SECRET_KEY,因为您不希望它们出现在您的源代码管理中,或者希望能够在不修改源文件的情况下调整它们。
因此,在您的 base.py(production.py 和 development.py 正在继承)中,您可以从文件中加载变量,例如:
import os
from dotenv import load_dotenv
load_dotenv() # .env file has to be in the same directory
# ...
import os
DJANGO_SETTINGS_MODULE = os.getenv("DJANGO_SETTINGS_MODULE")
print(DJANGO_SETTINGS_MODULE)
# ...
我个人不使用该包,因为我使用docker,它具有定义.env 文件的声明方式,但上面的代码应该让您了解它是如何工作的。有类似的软件包,例如django-environ,这本书在Two Scoops of Django 中有介绍。所以我倾向于使用这个而不是python-dotenv,这是一个口味问题。
【讨论】:
.env 文件技术吗?
您可能想要配置不同的设置文件。从这里你有两个选择。您可以在运行时使用 django-admin 设置参数
django-admin runserver --settings=thecelery.settings
此外,您可以选择在 settings.py 中配置设置。如果您当前有 1 个设置文件,这将需要您设置其他设置文件,并在实例上设置环境变量。然后在你的基本设置文件中,你可以这样做
import os
environment your_env = os.environ["environment"]
if your_env == "celery":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thecelerysettings")
else:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "defaultsettings")
【讨论】: