Django: загрузить настройки производства для сельдерея - PullRequest
0 голосов
/ 14 мая 2018

Мой проект Django содержит несколько файлов настроек для разработки, производства и тестирования.И я использую супервизора для управления работником сельдерея.Мой вопрос, как загрузить файл настроек для сельдерея в зависимости от среды, в которой я нахожусь.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Используя переменные окружения.Предположим, у вас есть следующие файлы настроек в корне вашего хранилища.

  • 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, дело вкуса.

0 голосов
/ 14 мая 2018

Скорее всего, вы хотите настроить различные файлы настроек. Отсюда у вас есть два варианта. Вы можете использовать параметр настроек 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...