django manage.py设置默认值

时间:2011-11-29 22:31:10

标签: python django

我有一个settings.py文件和一个dev_settings.py文件,我用它来覆盖一些用于开发目的的值。每次运行./manage.py命令时,我都必须指定--settings=whatever.local_settings。这样做每次都变得非常繁琐,我试图找到一种方法来强制manage.py每次默认加载我的dev_settings.py文件,这样我每次运行时都不必输入那个长参数命令。

我已尝试设置DJANGO_SETTINGS_MODULE,但似乎manage.py会覆盖此选项。

是否有可能实现这一目标,或者我注定要始终指定该论点?

5 个答案:

答案 0 :(得分:14)

manage.py为您设置设置路径,这就是它忽略DJANGO_SETTINGS_MODULE的原因(它基本上只是包裹django-admin.py的脚本)。

有两种简单的方法可以解决您的问题:

  1. 设置DJANGO_SETTINGS_MODULE并使用django-admin.py运行所有命令而不是manage.py。如果您使用vitualenv

  2. ,情况会更好
  3. 复制manage.py并将其命名为local.py(这是我的名称),并将所有settings提及重命名为dev_settings

  4. 例如:

    #!/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运行所有命令。

答案 1 :(得分:2)

通常这样做的方法是让settings.py具有环境之间常见的所有设置(例如INSTALLED_APPS等)。然后,您有类似settings_local.py的内容,它定义了特定于上下文环境的设置。然后,您在settings_local.py中导入settings.py

# settings.py

from settings_local import *

settings.py会添加到您的源代码存储库中,但settings_local.py却没有。 (但是,您通常会在回购邮件中添加settings_local.py.example之类的内容。)

例如,当您第一次将应用程序移至生产环境时,您需要从repo中下载代码库。然后,您将settings_local.py.example复制到settings_local.py并进行必要的环境更改。

然后,您在每个环境中都有单独的settings_local.py个文件,这一切都可以正常工作。

答案 2 :(得分:2)

您可以通过将这些行添加到.bash_profile文件来创建bash别名:

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

然后当您运行此命令时:

mng runserver

settings_debug.py文件将用于设置。

答案 3 :(得分:1)

您可以将django-admin.py与该环境变量一起使用。命令是可以互换的,只有django-admin.py不会覆盖您尝试使用的变量。

答案 4 :(得分:1)

如果设置文件对所有安装都是通用的,您只需导入它即可。

from settings_local import *

但通常settings_local会根据安装进行更改和调整,因为我的安装脚本会直接将文件复制到目标网站(不用担心什么是本地不可用),这意味着settings_local可能会被覆盖,以避免我只是将settings_local保留在父级安装目标的文件夹,并在settings.py中手动导入它,例如

local_settings_file = os.path.join(prevFolder, "settings_local.py")
if os.path.exists(local_settings_file):
    execfile(local_settings_file)