我想使用Celery来实现一个任务队列,以执行长期(ish)运行任务,例如与外部API交互(例如,用于SMS发送的Twilio)。但是,我在生产和开发中使用不同的API凭据。
我无法弄清楚如何静态配置Celery(即从命令行)以传递适当的API凭据。相关地,如果有开发队列和生产队列,我的应用程序代码(启动Celery任务)如何指定要与哪个Celery队列通信?
感谢您提供的任何帮助。 阿维
编辑:关于如何使用芹菜的--config选项的工作示例的额外奖励。
答案 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。