【问题标题】:django manage.py settings defaultdjango manage.py 设置默认
【发布时间】:2011-11-29 22:31:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    1. 设置DJANGO_SETTINGS_MODULE 并使用django-admin.py 代替manage.py 运行所有命令。如果你使用vitualenv,那就更好了。

    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 的所有命令。

    【讨论】:

    • 我走的是 django-admin.py 路线!我什至没有意识到你能做到这一点。我出于某种原因认为 django-admin.py 只是用于创建新项目。傻我...
    【解决方案2】:

    通常这样做的方式是您拥有 settings.py 以及环境之间通用的所有设置(例如 INSTALLED_APPS 等)。然后,你有类似settings_local.py 的东西,它定义了特定于上下文环境的设置。然后将settings_local.py 导入settings.py

    # settings.py
    
    from settings_local import *
    

    settings.py 被添加到您的源代码存储库中,但 settings_local.py 没有。 (但是,您通常会在 repo 中添加类似 settings_local.py.example 的内容。)

    例如,当您第一次将应用转移到生产环境时,您会从存储库中提取代码库。然后将settings_local.py.example 复制到settings_local.py 并进行任何必要的环境特定更改。

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

    【讨论】:

    • 我认为 @intargc 正在使用不同的技术 (toastdriven.com/blog/2010/jan/05/better-local-settings)。以这种方式扩展设置实际上更容易。
    • 嗯,他的抱怨是这种方法的缺点。我不一定不同意这种方法的逻辑,但它主要是语义上的,并且伴随着必须不断指定要使用的设置文件的成本。一切都是平等的,越简单越好,所以我说最后导入本地设置的传统方法是优越的。
    • 我不确定它是否真的相等。当我尝试使用这种技术扩展(而不是覆盖)变量时,它只是拒绝工作。那是前一段时间了。从那以后我使用第二个,它对我来说效果很好(通过创建新的 manage.py 来简化它,如我的回答中所述)。
    • 奇怪的是,我们采用了这种方式,而且效果很好。但是,我们与 Jacob Kaplan-Moss 进行了一次培训,他建议避免这种方式,原因有几个。所以我们都决定听从他的建议,走我们现在正在做的路线。
    • 好吧,我想我无法与 Jacob 争论;),但是 Django 开发人员以典型的方式强加了一个最佳实践,并没有真正让它易于遵循。在我看来,如果应该遵循这种做法,核心团队应该以一种开箱即用的方式支持它,而不是要求人们做类似修改 manage.py </soapbox> 之类的事情。
    【解决方案3】:

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

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

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

    mng runserver
    

    settings_debug.py 文件将用于设置。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果一个设置文件对所有安装都是通用的,你可以直接导入它,例如

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-10
          • 2011-07-23
          • 2018-07-21
          • 1970-01-01
          相关资源
          最近更新 更多