我有一個小型項目,我想部署到Heroku和OpenShift,在兩個平臺上嘗試。我使用Python/Django的所以我想利用動態導入功能的優勢來定義每一環境設置,保持這些平臺我要部署到,像,設置模塊:如何可靠地確定哪個PaaS是我的項目運行?
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
這將優選通過默認(未由我/開發人員設置)環境變量檢測此。 Heroku的暴露只是幾個:
DATABASE_URL
ENVIRONMENT
LANG
LD_LIBRARY_PATH
LIBRARY_PATH
PATH
PYTHONHASHSEED
PYTHONHOME
PYTHONPATH
PYTHONUNBUFFERED
SHARED_DATABASE_URL
而且OpenShift的:
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的情況。
如何可靠地使用環境變量檢測平臺?
OpenShift不允許您設置自定義環境變量(還),這就是爲什麼我要尋找一種「啓發式」方法。 –
您仍然可以檢查變量的存在(或缺失)。 –
'len('k for k in os.environ.keys()如果k.startswith('OPENSHIFT_')])> 0#測試OpenShift','len([k for k in os.environ.values ()如果k.find('heroku')> -1])> 0#測試Heroku'? –