2012-12-06 46 views
7

Tôi có một ứng dụng cần khởi tạo Celery và các thứ khác (ví dụ: cơ sở dữ liệu). Tôi muốn có một tệp .ini có chứa cấu hình ứng dụng. Điều này sẽ được chuyển đến ứng dụng khi chạy.Đọc cấu hình Celery từ tệp thuộc tính 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() 

Để bắt đầu cần tây, tôi gọi:

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

Liệu có cách nào để vượt qua trong tập tin cấu hình mà không làm một cái gì đó xấu xí như thiết lập một biến môi trường?

Trả lời

3

Làm cách nào để đặt biến môi trường xấu xí? Bạn có thể thiết lập một biến môi trường với phiên bản hiện tại của ứng dụng của bạn, hoặc bạn có thể lấy nó dựa trên tên máy, hoặc bạn có thể làm cho quá trình xây dựng/triển khai của bạn ghi đè lên tệp và phát triển bạn để development.ini sao chép sang settings.ini ở một vị trí chung, và về sản xuất bạn cho production.ini sao chép vào settings.ini.

Bất kỳ tùy chọn nào trong số này đều khá phổ biến. Sử dụng một công cụ quản lý cấu hình như đầu bếp hoặc con rối để đặt các tập tin tại chỗ là một lựa chọn tốt.

+0

Trong phiên bản tiếp theo (3.1, trong git thạc sĩ), bạn cũng có thể thêm đối số dòng lệnh của riêng mình, mà có thể được sử dụng như là một thay thế cho envvars. – asksol

+1

Xấu xí hay không, tôi đã tự hỏi điều tương tự như câu hỏi ban đầu, nhưng điều này không giúp trả lời nó. :(Mặc dù @ askol dẫn đầu là hữu ích. – shazow

5

Được rồi, tôi đã lấy lời khuyên của Jordan và sử dụng biến số env. Đây là những gì tôi nhận được trong 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() 

Để bắt đầu Cần tây:

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

http://hynek.me/articles/using-celery-with-pyramid/ cũng có một ví dụ tương tự hữu ích nếu bạn đang sử dụng Kim tự tháp. – shazow

Các vấn đề liên quan