选择Django中正确的设置文件

2 投票
1 回答
631 浏览
提问于 2025-05-01 00:12

我正在按照《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 个回答

2

os.environ.setdefault 这个方法只有在环境变量没有被设置的情况下才会给它赋值。当你在生产环境中运行程序时,记得导出环境变量 DJANGO_SETTINGS_MODULE,并把它设置为你的生产或测试设置文件。这样在开发环境中就不需要再设置任何东西了(如果你默认设置为开发环境的配置)。这种方法是最简洁的。

使用 local_settings.py 的方法(通常这个文件会被排除在代码库之外!)并不是最佳实践,应该尽量避免使用。

撰写回答