此解决方案无需额外参数即可工作,并且无需跨环境替换/删除文件。
让 settings.py 决定加载哪个文件
假设您的 Django 项目名为 MyDjangoApp。
在 Django 项目的根目录中创建 config/ 目录,并为每个环境创建一个 .py 文件,例如像这样:
config/
local.py
dev.py
prod.py
MyDjangoApp/
settings.py
环境的数量没有逻辑上的限制,我只是添加了我通常拥有的三个。
然后,在MyDjangoApp/settings.py 中,我们可以添加逻辑来选择要加载的设置文件。
"""
Django settings for MyDjangoApp project.
"""
import os
# Begin: Custom per-env settings
import socket
# Use the appropriate logic to understand "where" we're running
HOST = socket.gethostname()
configs = {
'localhost': 'local', # replace 'localhost' with whatever your machine name is
'dev.mysite.com': 'dev',
'www.mysite.com': 'production',
}
config = 'config.{}'.format(configs[HOST])
settings_module = __import__(config, globals(), locals(), ['MyDjangoApp', ])
try:
for setting in dir(settings_module):
# Only fully-uppercase variables are supposed to be settings
if setting == setting.upper():
locals()[setting] = getattr(settings_module, setting)
except Exception:
# you may ignore this exception, the print() is for debugging purposes
print(Exception)
# End: Custom per-env settings
# ... the rest of the common settings go here
请注意:此逻辑根据运行 Django 应用程序的服务器的 主机名 选择要加载的设置文件。这只是一个示例 - 您可以实现任何其他适合您的逻辑。
只改变需要的东西
好消息是,settings.py 仍然可以保存您的绝大多数设置,config/ 中的文件只需要包含在您的环境中更改的设置,例如:
避免在命令行中使用--settings
您可以将 Django 设置设置为 shell 环境变量,如下所示:
export DJANGO_SETTINGS_MODULE=MyDjangoApp.settings
执行此操作的最佳位置是在.sh 文件中;通常我会在 Django 项目的根目录中创建一个名为 env.sh 的文件,并在激活 virtualenv 后运行它(一次)。
文件 /env.sh 内容
#!/usr/bin/env bash
export DJANGO_SETTINGS_MODULE=MyDjangoApp.settings
要从终端(Bash,或 Windows 上的 git-scm Bash)运行它:
. env.sh
那么无论你身在何处都可以使用./manage.py runserver启动Django服务器。
参考:https://code.djangoproject.com/wiki/SplitSettings#DevelopmentMachineDependantSettingsConfiguration