Платформа приложений DigitalOcean не анализирует ${db.DATABASE_URL} после массовых изменений в редакторе
Я использую платформу DigitalOcean App Platform для развертывания приложения Django. Первоначальное развертывание прошло нормально, но я попытался использовать массовый редактор переменных среды на уровне компонентов, и с тех пор при выполнении происходит сбой развертывания dj_database_url.config(default=config('DATABASE_URL').
Для отладки я добавил эту строку в settings.py:
print(f"[BUILD DEBUG] DATABASE_URL = {repr(os.environ.get('DATABASE_URL'))}")
Это возвращает [BUILD DEBUG] DATABASE_URL = '${db.DATABASE_URL}' в журналах сборки.
Я не понимаю, почему переменная окружения не разрешает проблему. Спецификация моего приложения выглядит следующим образом:
services:
- environment_slug: python
envs:
- key: DATABASE_URL
scope: RUN_AND_BUILD_TIME
value: ${db.DATABASE_URL}
Может ли это быть ошибкой или я делаю что-то не так? Да, моя база данных названа правильно:
databases:
- engine: PG
name: db
Единственное, что изменилось между моим последним развертыванием и этим неудачным, помимо нескольких строк кода, это то, что я использовал массовый редактор для добавления новых переменных среды. Некоторые из существующих переменных среды были зашифрованы, но в спецификации приложения они выглядят нормально.
Синтаксис шаблона, например, ${db.DATABASE_URL}, не используется в файле спецификации приложения, он используется в панели управления Digital Ocean :
services:
envs:
- key: DATABASE_URL
scope: RUN_AND_BUILD_TIME
value: 'https://example.com'
Теперь в панели управления вы можете использовать синтаксис шаблона [docs]:
примечание: Я никогда не пользовался этой услугой.
Хотя это на самом деле не дает ответа на вопрос, почему мое приложение DigitalOcean вышло из строя только после использования массового редактора, я исправил свою проблему, поместив мое объявление DATABASES в блок try/except:
database_url = config('DATABASE_URL', default=None, cast=str)
try:
DATABASES = {
'default': dj_database_url.config(
default=database_url, conn_max_age=600)
}
except Exception as e:
print(f"Failed to parse DATABASE_URL, using default SQLite. Reason: {e}")
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Несмотря на элементарность, это работает как при разработке (где DATABASE_URL отсутствует в переменных среды), так и при производстве.
