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

Python 如何在生产和开发中以不同的方式静态配置芹菜应用程序?,python,celery,Python,Celery,我想使用芹菜来实现一个任务队列,以执行长时间(ish)运行的任务,如与外部API交互(例如,用于SMS发送的Twilio)。但是,我在生产和开发中使用不同的API凭据 我不知道如何静态配置芹菜(即从命令行)来传递适当的API凭据。与此相关的是,如果同时存在开发和生产队列,我的应用程序代码(启动芹菜任务)如何指定与哪个芹菜队列对话 谢谢你能提供的任何帮助。 阿维 编辑:关于如何使用芹菜的--config选项的工作示例的额外奖励。我这样做的方式是使用环境变量。作为一个简单的例子 # By conve

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

我不知道如何静态配置芹菜(即从命令行)来传递适当的API凭据。与此相关的是,如果同时存在开发和生产队列,我的应用程序代码(启动芹菜任务)如何指定与哪个芹菜队列对话

谢谢你能提供的任何帮助。 阿维


编辑:关于如何使用芹菜的--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
输出中可见。另一个想法(将凭证存储在配置文件中)远非理想,因为您应该避免将敏感信息存储在配置文件中

这就是为什么许多容器服务和PaaS提供商喜欢这种方法:更容易的检测和自动化部署


您可能想看看。

谢谢!另外两个问题:(1)如何通过非芹菜配置(例如我的Twilio证书)。(2) 我注意到现在芹菜还有一个--config命令行选项。但是,我不知道如何将任务发送给以这种方式配置的工作人员。有人知道怎么做吗?1)你可以做和我上面展示的完全一样的事情。这不是芹菜特有的。创建一个环境变量时,python会查看该变量并以这种方式配置自己。如何构造配置完全取决于您。不知道。可能会问另一个关于“如何使用--config参数”的问题?我在这里发布了一个关于--config的问题,希望有人知道我很抱歉,但是在提到的12因素应用程序链接“config”部分中,我没有找到任何一行声明在命令行参数上使用envs。事实上,我没有发现他们谈论任何关于命令行参数的事情。我需要看其他部分吗?@VikasPrasad第三项是。