我的Django项目有多个用于开发,生产和测试的设置文件。我正在使用主管来管理芹菜工人。我的问题是如何根据我所处的环境加载芹菜的设置文件。
答案 0 :(得分:1)
使用环境变量。假设您在存储库的根目录中有以下设置文件。
config.settings.development.py
config.settings.production.py
The recommended way在您的配置中,如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命令。
E.g。在您的生产系统上:
$ 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
,这是一种品味。
答案 1 :(得分:0)
您可能想要配置不同的设置文件。从这里你有两个选择。您可以在运行时使用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")