我正在做一个谷歌云Django项目。
如果我在开发或生产模式下运行,我正在尝试在settings.py
中进行检查。
我添加了以下代码块来测试运行程序的软件是否在我的机器上或谷歌云服务器上。
# | settings.py |
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'):
#code to execute in production
else:
#code to execute in development
我注意到if
语句总是false,所以我决定调试os.environ
语句。调试的结果是,环境的密钥SERVER_SOFTWARE的值等于gunicorn/20.1.0。
正如这个stackoverflow问题的正确答案所写,当在生产环境中运行时(谷歌云服务器应用程序引擎也是如此(,SERVER_SOFTWARE的值应该是谷歌应用程序引擎/X.Y.Z,其中X、Y和Z代表谷歌云的版本。但是,正如我所说,当我在应用程序引擎上运行时,我的价值并不是这样的,它是gunicorn/201.0。
那么,我如何让程序知道我是在开发还是在生产中运行呢?
我将介绍其他几个解决方案。
(1(GAE提供环境变量
GAE会自动设置在本地运行时可能没有设置的环境变量。我使用这个:
version = os.environ.get('GAE_VERSION', 'local')
您将在机器上获得生产中的实际版本和"本地"版本。
(2(检查请求URL
这是Flask,但Django中一定有类似的东西:
request.url_root == 'http://localhost:8080/'
不幸的是,您链接到的Stack Overflow(SO(答案已经有12年的历史了,并且引用了Python 2(已弃用(。我找不到SYSTEM_SOFTWARE
默认环境。适用于谷歌云平台(GCP(应用程序引擎标准(此处(和灵活环境(此处(。
可以肯定地说,env。应用程序引擎默认情况下注入到每个标准实例中的变量可以更改。相反,为什么不提供env呢。应用程序引擎标准环境中的变量。配置文件(app.yaml
(,以确保您的Django应用程序在";生产";只有当你想要的时候:
-
将
env_variables
部分添加到app.yaml
,例如:. . . env_variables: DJANGO_PRODUCTION_ENVIRONMENT: true . . .
或:
. . . env_variables: DJANGO_SYSTEM_SOFTWARE: "production" . . .
您可以查看更多应用程序引擎标准环境。配置。此处的设置。
-
将Django应用程序部署到AppEngineStandardenv。使用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 │
└──────────────────┴─────────┘
确认您的env。var.用制成$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