Активный файл настроек Django от работника Celery

Итак, я уже много искал для этого, но не нашел хорошего ответа. Я использую Celery 3.1.7 и Django 1.5.1 без пакета django-celery, так как более новые версии Celery больше не требуют этого. Мне удалось настроить задачи и выполнить их с помощью RabbitMQ. Там все работает как надо. Однако я интегрирую это в существующий довольно большой проект Django. Там мы указали пару файлов настроек Django, а не один. Мы запускаем разные в зависимости от среды, например, один для локальных машин и один для сервера. Моя проблема в том, что я не могу отследить, какой файл настроек является «активным» от работника celery, который запускает файл celery.py в корне моего проекта (как указано в документации). Там документация требует указать файл настроек Django следующим образом:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', "project.settings.server")

Теперь это работает, но если я перемещаю материал локально, мне нужно изменить его на settings.local, чтобы он работал, и так каждый раз. Чтение объекта настроек во время выполнения, как я делаю в стандартных файлах Django, не работает, поскольку celery worker выполняется в другом процессе. Итак, используя эту ситуацию, кто-нибудь знает, как динамически извлекать активный файл настроек Django из celery worker? Или, возможно, передать его как переменную при запуске celery worker? (например, для Django и т. д. --settings=project.settings.local) Спасибо!


person MaRiNkO    schedule 23.02.2014    source источник


Ответы (4)


Одна из идей может заключаться в том, чтобы Django загружал правильный файл настроек каждый раз и позволял celery использовать тот, который использует Django. Вот как я это делаю.

Скажем, у вас есть структура проекта:

project/
    proj/
        settings.py
        urls.py
        ...

Заменить

project/
    proj/
        settings/
            __init__.py
            local.py
            production.py
            common_settings.py
            ...
        urls.py
        ...

Пусть common_settings.py будет всеми настройками, общими для всех сред, и пусть ваш init.py загрузит любую конфигурацию, которую следует использовать.

# __init__.py:

from common_settings import *

# A check for environment variable, hostname, etc:
# Example for checking hostname:
from platform import node
if node() in ['dev1', 'dev2']:
    from local import *
elif node() in ['prod1', 'prod2']:
    from production import *

Теперь вы всегда можете положиться на то, что файл настроек project.proj.settings подходит для вашей среды.

person olofom    schedule 26.02.2014
comment
Мне действительно нравится этот подход, похоже, хорошее начало! Большое спасибо! - person MaRiNkO; 01.03.2014
comment
@Nirri, вы уверены, что импортируете все остальные файлы * в свой init.py в папке настроек? Это эквивалентно простому файлу настроек, поэтому он определенно должен работать независимо от того, на какой версии django вы работаете. - person olofom; 10.08.2016

При инициализации celery worker в командной строке просто установите переменную среды перед командой celery.

DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info

person lkiss80    schedule 29.09.2014
comment
Я знаю, что это слишком старая тема. Но я наткнулся на это, потому что мне нужно было то же самое. я сделал export DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info - person Rajesh Yogeshwar; 01.04.2016
comment
как я должен сделать это от супервайзера? - person Cody; 14.05.2018
comment
@Cody использует среду в вашем разделе [program:x] supervisord. орг/ - person Florian; 21.06.2018
comment
Комментарий @RajeshYogeshwar сработал для меня как талисман! Отличный обходной путь, когда настройки разделены средами. - person Ángel Jiménez; 21.11.2019

setdefault() возвращает значение переменной в системной среде. . Он вернет "project.settings.server", только если DJANGO_SETTINGS_MODULE не определено.

Итак, я бы оставил там наиболее часто используемый модуль настроек и менял его при необходимости, явно объявив переменную окружения:

то есть для локальной разработки, в ваших хуках virtualenv, в вашем .bashrc, вручную и т. д.:

export DJANGO_SETTINGS_MODULE=project.settings.local.

person Adrián    schedule 26.02.2014
comment
Хороший совет, но у меня также есть несколько настроек сервера для нескольких серверных сред, поэтому для каждого из них потребуется настроить хуки, что нарушает мою идею работы из коробки. В противном случае хороший подход, может использовать его для чего-то другого, спасибо! - person MaRiNkO; 01.03.2014

нашел это похороненным в документах сельдерея:

# project/app/tasks.py
app = Celery()
app.config_from_object('django.conf:settings')

http://celery.readthedocs.org/en/latest/whatsnew-3.1.html#django-supported-out-of-the-box

Это просто вытащит настройки сельдерея из файла настроек django, что обычно требуется для разделения среды.

person bigjust    schedule 22.10.2014