我有许多相同的数据库实例
我希望我的Django设置能够以最小的努力选择其中任何一个。我不想保留多个设置文件。
我知道我可以像这样配置它们但是如何切换到默认值以外的任何人。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'HOST': 'localhost'
},
'staging': {
'ENGINE': 'django.db.backends.sqlite3',
'HOST': 'staging.server.com'
},
'production': {
'ENGINE': 'django.db.backends.sqlite3',
'HOST': 'www.server.com'
}
}
答案 0 :(得分:2)
[更新]
对于配置/代码分离,我使用的是一个名为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': '',
}
}
请阅读“the twelve factors app”以获取有关此练习背后原理的更长解释,并阅读“stop writing settings files”以了解Django设置的实用方法。
我还建议使用virtualenv。一些提示:
/var/lib/python-virtualenvs
workon project_name
我使用这样的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)
答案 1 :(得分:0)
我找到了一种方法,但我不确定这是否是正确的方法。请评论。
我的主要settings.py和DATABASES设置看起来像......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'HOST': 'www.server.com'
}
}
在这个文件的末尾,我有以下代码......
# Load the local overrides if there are any.
try:
from settings_local import *
except ImportError, e:
pass
然后我在同一位置有一个settings_local.py文件,但在我的本地环境中被Git忽略,如下所示......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'HOST': 'localhost'
}
}
如果在settings.py所在的目录中没有settings_local.py文件,则此应用程序可以连接到生产数据库服务器;如果此文件存在,则允许连接到本地(或登台)数据库。
答案 2 :(得分:0)
所以我一直在阅读这本书Two Scoops of Django,整个第5章都基于这个问题。本章 设置和需求文件 ,回答了我的所有问题。本章基于OSCON 2011上的Jacob Kaplan-Moss'The Best (and worst) of Django演讲。请参阅第47页及其后的幻灯片。
基本上,我们的想法是使用多个设置文件,即settings / base.py,settings / local.py,settings / production.py等。并在使用--settings开关启动服务器时使用正确的文件