我想使用Celery来实现一个任务队列,以执行长时间(ish)运行的任务,如与外部API交互(例如,用于SMS发送的Twilio)。然而,我在生产和开发中使用不同的API证书。
我不知道如何静态配置Celery(即从命令行)以传入适当的API凭据。与此相关的是,如果同时存在开发和生产队列,我的应用程序代码(用于启动Celery任务)如何指定要与哪个Celery队列对话?
谢谢你能提供的任何帮助。Avi
EDIT:关于如何使用芹菜的--config选项的工作示例的额外奖励。
我这样做的方式是使用环境变量。举个简单的例子。。。
# 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
这个问题有一个这样做的例子,但他们说"我怎么能用一种不那么丑陋的方式来做这件事?"就我而言,这是可以接受的,一点也不"丑陋"。
根据十二因素应用程序,您应该使用环境变量而不是命令行参数。
如果您使用访问凭据等敏感信息,则情况尤其如此,因为它们在ps
输出中可见。另一种想法(将凭据存储在配置文件中)远非理想,因为您应该避免在VCS中存储敏感信息。
这就是为什么许多容器服务和PaaS提供商喜欢这种方法:更容易的检测和自动化部署。
您可能需要了解Python部署反模式。