【问题标题】:Google Cloud Django if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'): not workingGoogle Cloud Django if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'): 不工作
【发布时间】:2021-12-31 13:09:08
【问题描述】:

我正在开发一个 Google Cloud Django 项目。

如果我在开发或生产模式下运行,我正在尝试签入settings.py

我添加了以下代码块来测试运行程序的软件是在我的机器上还是在 Google 云服务器上。

# | settings.py |
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'):
    #code to execute in production
else:
    #code to execute in development

我注意到if 状态是always false,所以我决定调试os.environ 字典。 调试的结果是环境的键SERVER_SOFTWARE的值等于gunicorn/20.1.0

正如stackoverflow question 的正确答案所写,在生产环境中运行时(如在 Google Cloud Server App Engine 上),SERVER_SOFTWARE 的值应该是 Google App Engine/XYZ,其中 X、Y 和 Z 代表 Google Cloud 的版本。但是,正如我所说,在 App Engine 上运行时,我的价值不是那样,而是 gunicorn/20.1.0

那么,我如何让程序知道我是在开发还是生产中运行?

【问题讨论】:

  • 您的 Django 应用程序是在 App Engine 标准还是灵活 (AEF) 环境中运行?您链接的答案提到了 App Engine 标准环境。仅限。
  • 我猜我是在标准版上运行的
  • 你说 - 你猜。你可否确认?检查您的 app.yaml 文件中是否有 env: flex

标签: python django google-app-engine google-cloud-platform


【解决方案1】:

不幸的是,您链接到的 Stack Overflow (SO) 答案已有将近 12 年的历史,并且指的是 Python 2(已弃用)。我找不到SYSTEM_SOFTWARE 默认环境。变种。适用于 Google Cloud Platform (GCP) App Engine 标准 (here) 和柔性环境 (here)。

可以肯定地说 env.变种。默认情况下,App Engine 注入每个 Standard 实例可以更改。相反,你为什么不提供一个环境。变种。在您的 App Engine 标准环境中。配置文件 (app.yaml) 以确保您的 Django 应用程序仅在您希望时在“生产”中运行:

  1. env_variables部分添加到app.yaml,如:

    . . .
    env_variables:
      DJANGO_PRODUCTION_ENVIRONMENT: true
    . . .
    

    或:

    . . .
    env_variables:
      DJANGO_SYSTEM_SOFTWARE: "production"
    . . .
    

    您可以查看更多 App Engine 标准环境。配置。设置here

  2. 将您的 Django 应用程序部署到 App Engine 标准环境。使用 GCP Cloud SDK (gcloud):

    gcloud app deploy --appyaml=./app.yaml
    

确认旧版本(例如,$AES_OLD_VERSION)已停止:

gcloud app versions list \
--format="table[box=true](version.id:label=ID, version.servingStatus:label=STATUS)" \
--service=$AES_SERVICE_ID
┌──────────────────┬─────────┐
│        ID        │  STATUS │
├──────────────────┼─────────┤
│      . . .       │  . . .  │
│ $AES_OLD_VERSION │ STOPPED │
│ $AES_VERSION_ID  │ SERVING │
└──────────────────┴─────────┘

确认您的环境。变种。已进入$AES_VERSION_ID 并:

gcloud app versions describe $AES_VERSION_ID \
--format="yaml(envVariables)" \
--service=$AES_SERVICE_ID

#=>

envVariables:
  DJANGO_PRODUCTION_ENVIRONMENT: 'True'
  DJANGO_SYSTEM_SOFTWARE: production

【讨论】:

    【解决方案2】:

    我将介绍其他几个解决方案。

    (1) GAE 提供的环境变量

    GAE 会自动设置您在本地运行时可能没有设置的环境变量。我用这个:

    version = os.environ.get('GAE_VERSION', 'local')
    

    您将在您的机器上获得实际的生产版本和“本地”版本。

    (2) 检查请求网址

    这是 Flask 但在 Django 中一定有类似的东西:

    request.url_root == 'http://localhost:8080/'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 2021-09-25
      • 2022-01-24
      • 2020-08-11
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多