【问题标题】:Conditions based on Stage (dev, qual, prod) [closed]基于阶段的条件(开发、质量、产品)[关闭]
【发布时间】:2023-10-17 00:26:01
【问题描述】:

在我的上下文中,系统有一个阶段。系统可以是生产系统、质量保证系统或开发系统。

我知道应该避免基于阶段的条件,并且在测试中应该使用模拟来改变事情。例如,在单元测试期间第三方系统不可用,应该使用模拟来伪造第三方系统的存在。

但有时我有这样的条件:

if settings.STAGE == constants.STAGE_DEV:
    ....

到目前为止,constants 来自我们的旧库。

我希望尽可能多地使用开源解决方案,并避免自己编写基本的东西。

有没有比使用上述自制解决方案更好的方法?

Martijn Pieters 说:

那是因为也没有万能的配置解决方案。而且永远不会有。

这让我感到难过。我还是抱有希望,未来会有一个“最小公分母”。

【问题讨论】:

  • 我不确定我是否正确理解了您的问题,因此不确定这是否有帮助。但是,如果您只想拥有一个包含有关您所在环境的提示的地方(DEV/TST/PRD/...) - 我经常看到客户端提供了一个可用的环境变量来存储此信息。
  • @ingofreyer 是否有环境变量的标准命名约定?
  • 目前没有找到 - 抱歉
  • 部署模式为just configuration,一组标准配置设置。没有万能的解决方案,它实际上只是您现有配置解决方案可以处理的一个大开关。
  • @MartijnPieters 关于“一刀切解决方案”。是的,你是对的。这还不存在。到目前为止,还没有众所周知的默认方式。

标签: python development-environment production-environment


【解决方案1】:

我认为你应该考虑稍微改变一下轨道。虽然环境的概念(顺便说一下,我通常称之为 ENV)在部署脚本、启动脚本、Dockerfile 等中很常见且很有用,但将它们放在应用程序代码中势必会造成麻烦。

更好的解决方案是让您的启动脚本了解环境并配置(或切换)特定功能。

例如,

if settings.smtp_configured:
    send_email()

然后在您的启动脚本中,切换功能。有时在 settings.py 文件中执行此逻辑可能很有用,但我不喜欢这样做,因为每次环境更改时我都必须修改它。这完全取决于您的应用程序的部署方式。

【讨论】:

  • 是的,例如运行测试将是一场噩梦;因为您(OP)也有测试环境,对吗?因此,每当您拥有 if env == prod 时,它都会被跳过,因为当前的环境是测试环境。