2012-12-06 16 views
7

Ho un'applicazione che deve inizializzare Celery e altre cose (ad es. Database). Mi piacerebbe avere un file .ini che conterrebbe la configurazione delle applicazioni. Questo dovrebbe essere passato all'applicazione in fase di esecuzione.Leggi la configurazione di Celery dal file delle proprietà Python

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() 

Per avviare Sedano, che io chiamo:

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

Esiste un modo per passare nel file di configurazione, senza fare qualcosa di brutto come impostare una variabile d'ambiente?

risposta

3

Come è l'impostazione di una variabile di ambiente brutta? È possibile impostare una variabile di ambiente con la versione corrente dell'applicazione, oppure è possibile derivarla in base al nome host, oppure è possibile rendere il processo di compilazione/distribuzione sovrascrivere il file e, durante lo sviluppo, consentire a development.ini di copiare su settings.ini in una posizione generale, e in produzione si lascia copiare production.ini su settings.ini.

Una di queste opzioni è abbastanza comune. Utilizzare uno strumento di gestione della configurazione come Chef o Puppet per mettere il file in posizione è una buona opzione.

+0

Nella prossima versione (3.1, in master git) è anche possibile aggiungere i propri argomenti della riga di comando, che potrebbe essere usato come alternativa a envvars. – asksol

+1

Brutto o no, mi stavo chiedendo la stessa cosa della domanda originale, ma questo non aiuta a rispondere. :(Anche se l'aiuto di @ askol è utile: – shazow

5

OK, ho preso il consiglio di Jordan e ho utilizzato una variabile ENV. Questo è ciò che ottengo in celeryconfig.py:

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() 

Per iniziare Sedano:

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

http://hynek.me/articles/using-celery-with-pyramid/ ha anche un esempio simile che è utile se stai usando Pyramid. – shazow

Problemi correlati