Используя переменные окружения.Предположим, у вас есть следующие файлы настроек в корне вашего хранилища.
config.settings.development.py
config.settings.production.py
- ...
Рекомендуемый способ для определения вашего экземпляра сельдерея в вашей конфигурации, например, celery.py
module:
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
.
Чтобы установить эти переменные в вашей системе подготовки, тестирования и производства, вы можете выполнить следующую командукоманда.
Например, в вашей производственной системе:
$ 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-environment , который описан в книге Two Scoops of Django .Поэтому я предпочел бы использовать это вместо python-dotenv
, дело вкуса.