django manage.py 设置 默认

15 投票
5 回答
13507 浏览
提问于 2025-04-17 07:21

我有一个叫做 settings.py 的文件,还有一个叫 dev_settings.py 的文件,用来在开发时覆盖一些设置。每次我运行 ./manage.py 命令的时候,都得加上 --settings=whatever.local_settings 这个参数。这样每次都要输入这个参数真的很麻烦,我想找个办法让 manage.py 默认加载我的 dev_settings.py 文件,这样我就不用每次都输入这么长的参数了。

我试过设置 DJANGO_SETTINGS_MODULE,但是看起来 manage.py 会覆盖这个选项。

这样做有可能实现吗?还是说我注定要一直输入这个参数呢?

5 个回答

2

你可以通过在你的 .bash_profile 文件中添加以下几行来创建一个 bash 别名:

mymanage()
{
python manage.py $1 --settings=settings_debug
}
alias mng=mymanage

然后当你运行这个命令时:

mng runserver

settings_debug.py 文件将会被用作设置文件。

3

通常,这种做法是你会有一个叫做 settings.py 的文件,里面包含了所有环境之间共同的设置(比如说 INSTALLED_APPS 之类的东西)。然后,你会有一个类似 settings_local.py 的文件,专门定义当前环境特有的设置。接着,你在 settings.py 中引入 settings_local.py

# settings.py

from settings_local import *

settings.py 会被添加到你的源代码库中,但 settings_local.py 不会被添加。(不过,通常你会把一个像 settings_local.py.example 的文件添加到库里。)

比如说,当你第一次把应用程序迁移到生产环境时,你会从你的代码库中拉取代码。然后,你会把 settings_local.py.example 复制一份,命名为 settings_local.py,并根据需要进行一些特定于环境的修改。

这样,你在每个环境中都有不同的 settings_local.py 文件,一切都能正常工作。

18

manage.py 是一个脚本,它会自动设置你的配置文件路径,所以它会忽略 DJANGO_SETTINGS_MODULE 这个环境变量(其实它就是一个包装了 django-admin.py 的脚本)。

要解决你的问题,有两种简单的方法:

  1. 设置 DJANGO_SETTINGS_MODULE,然后使用 django-admin.py 来运行所有命令,而不是使用 manage.py。如果你使用 virtualenv,这样做会更好。

  2. 复制 manage.py,然后把它命名为 local.py(在我的例子中是这个名字),并把所有提到 settings 的地方改成 dev_settings

例如:

#!/usr/bin/env python
from django.core.management import execute_manager
import imp

try:
    import settings_local
except ImportError:
    import sys
    sys.stderr.write("Error: Can't find the file 'settings_local.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
    sys.exit(1)

if __name__ == "__main__":
    execute_manager(settings_local)

现在你可以通过 ./local.py 来运行所有命令了。

撰写回答