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 应用程序 运行 仅在您希望它时处于“生产”状态:
将env_variables
部分添加到app.yaml
,如:
. . .
env_variables:
DJANGO_PRODUCTION_ENVIRONMENT: true
. . .
或:
. . .
env_variables:
DJANGO_SYSTEM_SOFTWARE: "production"
. . .
您可以查看更多 App Engine 标准环境。配置。设置 here.
将您的 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/'
我正在开发一个 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 应用程序 运行 仅在您希望它时处于“生产”状态:
将
env_variables
部分添加到app.yaml
,如:. . . env_variables: DJANGO_PRODUCTION_ENVIRONMENT: true . . .
或:
. . . env_variables: DJANGO_SYSTEM_SOFTWARE: "production" . . .
您可以查看更多 App Engine 标准环境。配置。设置 here.
将您的 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/'