如何在生产和开发中以不同方式静态配置Celery应用程序?

时间:2013-06-20 17:34:44

标签: python celery

我想使用Celery来实现一个任务队列,以执行长期(ish)运行任务,例如与外部API交互(例如,用于SMS发送的Twilio)。但是,我在生产和开发中使用不同的API凭据。

我无法弄清楚如何静态配置Celery(即从命令行)以传递适当的API凭据。相关地,如果有开发队列和生产队列,我的应用程序代码(启动Celery任务)如何指定要与哪个Celery队列通信?

感谢您提供的任何帮助。 阿维

编辑:关于如何使用芹菜的--config选项的工作示例的额外奖励。

2 个答案:

答案 0 :(得分:3)

我这样做的方法是使用环境变量。举个简单的例子......

# By convention, my configuration files are in a "configs/XXX.ini" file, with
# XXX being the configuration name (e.g., "staging.ini")
config_filename = os.path.join('configs', os.environ['CELERY_CONFIG'] + '.ini')
configuration = read_config_file(config_filename)

# Now you can create the Celery object using your configuration...
celery = Celery('mymodule', broker=configuration['CELERY_BROKER_URL'])

@celery.task
def add_stuff(x, y):
    ....

你最终会从命令行运行......

export CELERY_CONFIG=staging
celery -A mymodule worker

This question有一个做这样的事情的例子,但他们说"我怎么能以一种不那么难看的方式做到这一点?"就我而言,这是完全可以接受的,而不是"丑陋的"一点都不。

答案 1 :(得分:0)

根据twelve factor app,您应该使用环境变量而不是命令行参数。

如果您使用访问凭据等敏感信息,则尤其如此,因为它们在ps输出中可见。另一个想法(在配置文件中存储凭据)远非理想,因为您应该避免在VCS中存储敏感信息。

这就是为什么许多容器服务和PaaS提供商都支持这种方法:更简单的检测和自动部署。

您可能需要查看Python Deployment Anti-patterns