选择Django中正确的设置文件
我正在按照《Two Scoops of Django: Best Practices for Django 1.6》这本书里的方法来处理多个设置文件。我现在使用的是Django 1.7和virtualenvwrapper。
我的设置如下:
project/
app1/
app2/
project/
__init__.py
settings/
__init__.py
base.py
local.py
production.py
manage.py
我有点困惑,Django是怎么知道该用哪个设置文件的。我不想每次运行manage.py的时候都指定设置文件。我更希望能像omouse的回答中提到的那样,设置一个DJANGO_SETTINGS_MODULE的环境变量,具体可以在这里找到。
让我困惑的是,在wsgi.py文件中有一行:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings.production")
这个文件是只在生产服务器上使用吗?如果我在服务器上已经定义了DJANGO_SETTINGS_MODULE的环境变量,会发生什么呢?
在本地运行时,我知道每次打开控制台都需要设置DJANGO_SETTINGS_MODULE这个环境变量。我在这里读到我可以在virtualenvwrapper中定义一个postactivate钩子。这个钩子会在我激活环境时创建我需要的环境变量。
这样做是确保我的本地机器上加载正确的DJANGO_SETTINGS_MODULE环境变量的推荐方法吗?我还需要在我的托管服务器上设置一个类似的文件吗?我打算使用PythonAnywhere来托管。
最后,如果我运行一个预发布服务器,我该如何告诉Django加载预发布的设置文件呢?预发布服务器和生产服务器几乎是一样的,所以我想我需要一个不同的wsgi.py文件来处理预发布服务器,但这似乎不太符合常规做法。
1 个回答
os.environ.setdefault
这个方法只有在环境变量没有被设置的情况下才会给它赋值。当你在生产环境中运行程序时,记得导出环境变量 DJANGO_SETTINGS_MODULE
,并把它设置为你的生产或测试设置文件。这样在开发环境中就不需要再设置任何东西了(如果你默认设置为开发环境的配置)。这种方法是最简洁的。
使用 local_settings.py
的方法(通常这个文件会被排除在代码库之外!)并不是最佳实践,应该尽量避免使用。