[更新]
对于配置/代码分离,我使用了一个名为django-decouple的项目,而不是滚动我自己的东西,原始答案的基本原理仍然有效。
[原答案]
我建议使用环境变量而不是 if/elif 链和/或包含。主要原因是:
- 配置在不同部署中变化很大,代码没有 - 因此您应该致力于将配置与代码严格分离。
- 环境特定信息与环境有关 - 环境变量很容易在部署之间更改,而无需更改任何代码。
- 避免意外将密码等敏感信息检查到源代码控制中。
例如:
DATABASES = {
'default': {
'ENGINE': os.environ.get('DB_NAME', 'django.db.backends.sqlite3'),
'NAME': os.environ.get('DB_NAME', 'some_default'),
'USER': os.environ.get('DB_USER', ''),
'PASSWORD': os.environ.get('DB_PASS', ''),
'HOST': os.environ.get('DB_HOST', ''),
'PORT': '',
}
}
请阅读“十二因素应用程序”以获得有关此实践背后原理的详细说明,并阅读“停止编写设置文件”以获得 Django 设置的实用方法。
我还建议使用 virtualenv。一些技巧:
- 将我的应用程序放在 /opt/django-apps/project_name 之类的路径中
- 安装 virtualenvwrapper 并在某个路径下创建一个与项目名称相同的 virtualenv,例如
/var/lib/python-virtualenvs
workon project_name
当你想在项目中工作时发出 a
我使用wsgi.py
这样的:
import os
import site
import sys
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(APP_ROOT)
PROJECT_NAME = os.path.basename(APP_ROOT)
INSTANCE_NAME = os.path.basename(ROOT)
VENV = '/var/lib/python-virtualenvs/{}/'.format(INSTANCE_NAME)
# Add the site-packages of the chosen virtualenv to work with
site.addsitedir(VENV + 'lib/python2.7/site-packages')
# Add the app's directory to the PYTHONPATH
sys.path.append(ROOT)
# Activate your virtual env
activate_env=os.path.expanduser(VENV + "bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", PROJECT_NAME + ".settings")
from django.core.wsgi import get_wsgi_application
_application = get_wsgi_application()
def application(environ, start_response):
os.environ['DEBUG'] = environ['DEBUG']
os.environ['DB_NAME'] = environ['DB_NAME']
os.environ['DB_PASS'] = environ['DB_PASS']
os.environ['DB_HOST'] = environ['DB_HOST']
os.environ['DB_USER'] = environ['DB_USER']
return _application(environ, start_response)