2012-12-06 9 views
7

Ich habe eine Anwendung, die Sellerie und andere Dinge (z. B. Datenbank) initialisieren müssen. Ich hätte gerne eine INI-Datei, die die Anwendungskonfiguration enthalten würde. Dies sollte zur Laufzeit an die Anwendung übergeben werden.Lesen Sellerie Konfiguration von Python-Eigenschaftendatei

development.init:

[celery] 
broker=amqp://localhost/ 
backend=amqp://localhost/ 
task.result.expires=3600 

[database] 
# database config 
# ... 

celeryconfig.py:

from celery import Celery 
import ConfigParser 

config = ConfigParser.RawConfigParser() 
config.read(...) # Pass this from the command line somehow 

celery = Celery('myproject.celery', 
       broker=config.get('celery', 'broker'), 
       backend=config.get('celery', 'backend'), 
       include=['myproject.tasks']) 

# Optional configuration, see the application user guide. 
celery.conf.update(
    CELERY_TASK_RESULT_EXPIRES=config.getint('celery', 'task.result.expires') 
) 

# Initialize database, etc. 

if __name__ == '__main__': 
    celery.start() 

Sellerie zu starten, ich rufe:

celery worker --app=myproject.celeryconfig -l info 

Gibt es trotzdem in der Konfigurationsdatei zu übergeben, ohne Etwas Hässliches tun, etwa eine Umgebungsvariable setzen?

Antwort

3

Wie ist das Setzen einer Umgebungsvariablen hässlich? Entweder Sie setzen eine Umgebungsvariable mit der aktuellen Version Ihrer Anwendung, oder Sie können sie basierend auf dem Hostnamen ableiten, oder Sie können Ihren Build/Deployment-Prozess die Datei überschreiben lassen und bei der Entwicklung lassen Sie die Datei "developer.ini" in die Datei "settings.ini" kopieren An einem allgemeinen Ort und bei der Produktion lässt du production.ini in die settings.ini kopieren.

Alle diese Optionen sind ziemlich häufig. Es ist eine gute Option, ein Konfigurationsverwaltungstool wie Chef oder Puppet zu verwenden, um die Datei zu platzieren.

+0

In der nächsten Version (3.1, in git Master) Sie können auch Ihre eigenen Befehlszeilenargumente hinzufügen, die könnte als Alternative zu Envvars verwendet werden. – asksol

+1

Hässlich oder nicht, ich fragte mich das gleiche wie die ursprüngliche Frage, aber das hilft nicht, es zu beantworten. :(Obwohl @ asesols Führung ist hilfreich. – shazow

5

Okay, ich nahm Jordans Ratschlag an und benutzte eine env Variable. Dies ist, was ich in celeryconfig.py erhalten:

celery import Celery 
import os 
import sys 
import ConfigParser 

CELERY_CONFIG = 'CELERY_CONFIG' 

if not CELERY_CONFIG in os.environ: 
    sys.stderr.write('Missing env variable "%s"\n\n' % CELERY_CONFIG) 
    sys.exit(2) 

configfile = os.environ['CELERY_CONFIG'] 

if not os.path.isfile(configfile): 
    sys.stderr.write('Can\'t read file: "%s"\n\n' % configfile) 
    sys.exit(2) 

config = ConfigParser.RawConfigParser() 
config.read(configfile) 

celery = Celery('myproject.celery', 
       broker=config.get('celery', 'broker'), 
       backend=config.get('celery', 'backend'), 
       include=['myproject.tasks']) 

# Optional configuration, see the application user guide. 
celery.conf.update(
    CELERY_TASK_RESULT_EXPIRES=config.getint('celery', 'task.result.expires'), 
) 

if __name__ == '__main__': 
    celery.start() 

Sellerie zu starten:

$ export CELERY_CONFIG=development.ini 
$ celery worker --app=myproject.celeryconfig -l info 
+0

http://hynek.me/articles/using-Sellery-with-Pyramid/ hat auch ein ähnliches Beispiel, das hilfreich ist, wenn Sie Pyramid verwenden. – shazow

Verwandte Themen