原文地址: http://www.sparklewise.com/django-settings-for-production-and-development-best-practices/
译者: TheLoverZ
当你刚开始使用 Django 的时候,你会很诧异竟然没有一个标准的配置。然而,作为一个初学者,确实有一些简单好用的办法。
问题在哪儿? Django 把所有的项目设置都存在一个叫做 settings.py 的文件里。在你不需要为了适应某些特定环境而手动改变配置的时候(比如说生产开发环境),Django 的做法看起来还算不错。
开发使用的配置文件应该和生产的不一样。为什么?
这里我列出了在不同环境之间可能会有变化的东西:
DEBUG
或者 TEMPLATE_DEBUG
)我们接下来要用三种方法来配置你的配置文件。
这个方法有一个 settings.py
文件,一些公共设置和一个特殊环境使用的 local_settings
文件。
我们来看看:
### settings.py file
### settings that are not environment dependent
try:
from local_settings import *
except ImportError:
pass
### local_settings.py
### environment-specific settings
### example with a development environment
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'django',
'PASSWORD': '1234',
'HOST': '',
'PORT': '',
}
local_settings.py
应该在源码管理的范围以外,你需要一个独立的文件来应对生产和开发环境。local_settings
的公共设置。但是这种方法在大多数简单的情况下都有用。在 Ches Martin 这儿有个例子。这个方法依赖于一个指向正确的 Python 模块的环境变量。它有直接明了的优点,所以你可以直接命名你的特殊设置文件(在这个例子中 production.py
是生产环境的配置文件):
[myapp]$ls settings
__init__.py
defaults.py
dev.py
staging.py
production.py
我们引用设置文件的时候会发生什么?设置文件在这个情况下是一个包(Python 的包是一个内含 __init__.py
的文件夹),所以当编译器加载包的时候会执行 __init__.py
文件。
默认情况下,我们来让它在开发环境下可以工作。
### __init.py__
from dev import *
### default.py__
## sensible choices for default settings
### dev.py
from defaults import *
DEBUG = True
### other development-specific stuff
### production.py
from defaults import *
DEBUG = False
### other production-specific stuff
怎么在生产环境和部署环境(Staging Environment)使用这个配置呢?
技巧就在于设置模块可以被覆盖。所以在启动服务器之前我们需要覆盖环境变量。比如说如果我们用 Apache 作为 Django 服务器的话,把你的 Apache 配置修改成:
SetEnv DJANGO_SETTINGS_MODULE myapp.settings.production
### settings.py
import os
ENVIRONMENT_SETTING_FILE = '/etc/django.myproject.settings'
### this will load all environment file settings in here
execfile(ENVIRONMENT_SETTING_FILE)
### all common settings
### ...
显而易见的,这种办法的一个问题就在于我们不能修改公共配置文件 settings.py
里面定义好的变量。
但是另一个方面,这个方法简化了配置文件的管理。分别创造一个开发所需的,一个部署所需的,以及生产所需的,做好保密措施,然后你就没事儿了。
还有很多办法来管理你的配置,所以你可以多折腾折腾。看看下面列出的资料会很有好处。如果你有高见,来留个言吧!