Google Cloud Django if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'): не работает
Я работаю над проектом Google Cloud Django Project.
Я пытаюсь проверить settings.py
, работаю ли я в режиме разработки или производства.
Я добавил следующий блок кода, чтобы проверить, находится ли ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ, на котором запущена программа, на моей машине или на серверах Google Cloud Servers.
# | settings.py |
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'):
#code to execute in production
else:
#code to execute in development
Я заметил, что if
statment является always false, поэтому я решил отладить os.environ
dict.
В результате отладки значение ключа SERVER_SOFTWARE среды равно gunicorn/20.1.0.
Как написано в правильном ответе на этот вопрос на stackoverflow, при работе на продакшене (то есть на 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), на который вы ссылаетесь, почти двенадцатилетней давности и относится к Python 2 (устаревшему). Я не смог найти SYSTEM_SOFTWARE
переменную env. var. по умолчанию как для стандартной среды Google Cloud Platform (GCP) App Engine Standard ( здесь), так и для среды Flexible ( здесь).
Можно с уверенностью сказать, что env. var., которую App Engine по умолчанию внедряет в каждый экземпляр Standard может измениться. Вместо этого, почему бы вам не указать env. var. в вашем файле конфигурации App Engine Standard env. (app.yaml
), чтобы убедиться, что ваше приложение Django работает в "production" только тогда, когда вы этого хотите:
Добавьте раздел
env_variables
кapp.yaml
, например:. . . env_variables: DJANGO_PRODUCTION_ENVIRONMENT: true . . .
или:
. . . env_variables: DJANGO_SYSTEM_SOFTWARE: "production" . . .
Вы можете посмотреть больше настроек стандартного окружения App Engine здесь .
Разверните ваше приложение Django в App Engine Standard env. с помощью 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
Я представлю несколько других решений.
(1) GAE предоставил env vars
GAE автоматически устанавливает переменные окружения, которые вы, вероятно, не устанавливаете при локальном запуске. Я использую следующее:
version = os.environ.get('GAE_VERSION', 'local')
Вы получите актуальную версию в production и "локальную" на вашей машине.
(2) Проверьте URL запроса
Это Flask, но в Django должно быть что-то похожее:
request.url_root == 'http://localhost:8080/'