Google Cloud Django if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'): 不工作

Google Cloud Django if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'): not working

我正在开发一个 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字典。 debug的结果是环境的keySERVER_SOFTWARE的值等于gunicorn/20.1.0 .

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

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

不幸的是,您链接到的 Stack Overflow (SO) 答案已有将近 12 年的历史,并且指的是 Python 2(已弃用)。我找不到 SYSTEM_SOFTWARE 默认环境。变种。 Google 云平台 (GCP) App Engine 标准 (here) and Flexible environment (here).

可以肯定地说,环境。变种。默认情况下,App Engine 注入每个标准实例 可以 更改。相反,你为什么不提供一个环境。变种。在您的 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

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

(1) GAE 提供了环境变量

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

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

您将在生产中获得实际版本,并在您的计算机上 'local'。

(2) 检查请求URL

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

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