내 프로젝트가 실행되는 PAAS를 안정적으로 결정하는 방법은 무엇입니까?
-
11-12-2019 - |
문제
Heroku와 OpenShift에 모두 배포하고 싶은 작은 프로젝트가 있으며 두 플랫폼 모두에서 일을 시도해보십시오.나는 파이썬 / Django를 사용하므로 동적 가져 오기 기능을 이용하여 환경 당 설정을 정의하고 배포하려는 플랫폼의 설정 모듈을 유지 관리하는 것과 같이 다음과 같이 배포 할 것입니다.
my_project/
settings/
__init__.py <-- This is what's being imported during app init, here is where I want to detect which platform specific settings module to load
dev_settings.py
heroku_settings.py
openshift_settings.py
.
지금까지는이 코드를 사용합니다 :
ENVIRONMENT = the_function_or_code_that_returns_the_environment() # Defaults to "dev"
from django.utils.importlib import import_module
try:
# Import any symbols that begin with A-Z. Append to lists any symbols that
# begin with "EXTRA_".
local_settings_module_name = '%s_settings' % ENVIRONMENT
local_settings = import_module(local_settings_module_name)
import re
for attr in dir(local_settings):
match = re.search('^EXTRA_(\w+)', attr)
if match:
name = match.group(1)
value = getattr(local_settings, attr)
try:
globals()[name] += value
except KeyError:
globals()[name] = value
elif re.search('^[A-Z]', attr):
globals()[attr] = getattr(local_settings, attr)
except ImportError:
pass
.
기본값 (ME / Developer) 환경 변수를 통해이를 통해이를 감지하는 것이 바람직합니다.헤르 쿠 (Heroku)는 단지 몇 번 노출됩니다 :
DATABASE_URL
ENVIRONMENT
LANG
LD_LIBRARY_PATH
LIBRARY_PATH
PATH
PYTHONHASHSEED
PYTHONHOME
PYTHONPATH
PYTHONUNBUFFERED
SHARED_DATABASE_URL
.
및 openshift 's :
OPENSHIFT_DB_HOST
OPENSHIFT_LOG_DIR
OPENSHIFT_TMP_DIR
OPENSHIFT_DB_CTL_SCRIPT
OPENSHIFT_REPO_DIR
OPENSHIFT_HOMEDIR
OPENSHIFT_GEAR_NAME
OPENSHIFT_PHPMYADMIN_IP
OPENSHIFT_RUNTIME_DIR
OPENSHIFT_INTERNAL_PORT
OPENSHIFT_PHPMYADMIN_CTL_SCRIPT
OPENSHIFT_DB_MYSQL_51_RESTORE
OPENSHIFT_DB_MYSQL_51_DUMP
OPENSHIFT_DB_PASSWORD
OPENSHIFT_DB_USERNAME
OPENSHIFT_PHPMYADMIN_GEAR_DIR
OPENSHIFT_RUN_DIR
OPENSHIFT_INTERNAL_IP
OPENSHIFT_GEAR_DIR
OPENSHIFT_GEAR_CTL_SCRIPT
OPENSHIFT_APP_DNS
OPENSHIFT_GEAR_TYPE
OPENSHIFT_GEAR_DNS
OPENSHIFT_DB_MYSQL_51_EMBEDDED_TYPE
OPENSHIFT_DB_URL
OPENSHIFT_APP_NAME
OPENSHIFT_DATA_DIR
OPENSHIFT_DB_SOCKET
OPENSHIFT_GEAR_UUID
OPENSHIFT_APP_UUID
OPENSHIFT_DB_TYPE
OPENSHIFT_DB_MYSQL_51_DUMP_CLEANUP
OPENSHIFT_DB_PORT
.
openshift 변수는 OPENSHIFT_
접두사가 있으므로 시작이 있지만 Heroku가있는 경우가 아닙니다.
환경 변수를 사용하여 플랫폼을 확실하게 감지 할 수 있습니까?
해결책 2
@Kevin, 답변으로서의 의견을 게시하므로 사람들은 신속하게 그것을 볼 수 있습니다 (또는 개선하십시오!) :
if len([k for k in os.environ.keys() if k.startswith('OPENSHIFT_')]):
ENVIRONMENT = 'openshift'
elif len([k for k in os.environ.values() if k.find('heroku') > -1]):
ENVIRONMENT = 'heroku'
local_settings_module_name = '%s_settings' % ENVIRONMENT
local_settings = import_module(local_settings_module_name)
# do the magic with the `local_settings` module
. 다른 팁
내 자신의 env 구성 설정을 설정하는 것이 좋습니다.이것은 Heroku를 쉽게 사용할 수 있습니다.
heroku config:add MY_DEPLOYMENT_PLATFORM=heroku
.
그런 다음 초기화 프로그램 (또는 필요한 경우)에서 다음과 같이 해당 값에 액세스 할 수 있습니다.
if ENV["MY_DEPLOYMENT_PLATFORM"] == "heroku"
// perform heroku config
else
// perform other PAAS config
end
. 현재 PAAS를 탐지하는 방법입니다.overide_settings 방법은 내 것이 아닙니다.
def override_settings(dottedpath):
"""Imports uppercase modules from an string based module.
Example:
override_settings('my.module.settings')
"""
try:
_m = import_module(dottedpath)
except ImportError:
warnings.warn("Failed to import %s" % dottedpath) # <-- will show up in your error log
else:
_thismodule = sys.modules[__name__]
for _k in dir(_m): # <-- moved the block inside else
if _k.isupper() and not _k.startswith('__'): setattr(_thismodule,
_k, getattr(_m, _k))
ON_OPENSHIFT = False
if os.environ.has_key('OPENSHIFT_REPO_DIR'):
ON_OPENSHIFT = True
ON_HEROKU = False
if os.environ.get('LD_LIBRARY_PATH', None) == '/app/.heroku/vendor/lib':
ON_HEROKU = True
if ON_OPENSHIFT:
override_settings('settings.openshift')
if ON_HEROKU:
override_settings('settings.heroku')
. 제휴하지 않습니다 StackOverflow