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" только тогда, когда вы этого хотите:

  1. Добавьте раздел env_variables к app.yaml, например:

    . . .
    env_variables:
      DJANGO_PRODUCTION_ENVIRONMENT: true
    . . .
    

    или:

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

    Вы можете посмотреть больше настроек стандартного окружения App Engine здесь .

  2. Разверните ваше приложение 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/'
Вернуться на верх