应用程序订单在INSTALLED_APPS中的重要性

lit*_*sha 24 python django

应用程序的顺序INSTALLED_APPS是否重要?我问,因为我有settings文件夹有两个settings文件:base.pyproduction.py我把我所有的设置中base.py,然后在production.py

 `from base import *` 
Run Code Online (Sandbox Code Playgroud)

并覆盖一些设置.在我的作品中,base.pyINSTALLED_APPS也是一个列表,而不是一个元组.因为我想删除一些production设置的应用程序.在production.py我想写:

NOT_USED_APPS = ['debut_toolbar', 'other_odd_app',]
INSTALLED_APPS = list(set(INSTALLED_APPS) - set(NOT_USED_APPS))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在应用程序的顺序INSTALLED_APPS是不一样的base.py

Rah*_*pta 27

是的,订单非常重要.

来自Django官方文档的INSTALLED_APPS设置:

当多个应用程序提供相同资源的不同版本(模板,静态文件,管理命令,转换)时,首先列出的应用程序INSTALLED_APPS具有优先权.

示例1模板:

django.template.loaders.app_directories.Loader

如果在您的DjangoTemplates后端在TEMPLATES设置中启用了此模板加载器,或者如果您已将其作为Engine的参数传递给Engine,那么它将从文件系统上的Django应用程序加载模板.

对于每个应用程序INSTALLED_APPS,加载程序查找模板子目录.如果目录存在,Django将在那里寻找模板.

让我们说在我的项目中,我定义INSTALLED_APPS为:

INSTALLED_APPS = ('myproject.app1', 'myproject.app2')
Run Code Online (Sandbox Code Playgroud)

现在,我想获得模板some_template.html.然后get_template('some_template.html')将按some_template.html以下顺序在这些目录中查找:

/path/to/myproject/app1/templates/ # checks here first
/path/to/myproject/app2/templates/ # Then checks here
Run Code Online (Sandbox Code Playgroud)

然后它将使用它首先找到的那个.

引用该部分:

顺序INSTALLED_APPS很重要!

示例2:翻译

Django应用以下算法来发现翻译:

  1. 列出的目录LOCALE_PATHS具有最高优先级,首先出现的目录优先级高于稍后出现的目录.
  2. 然后,它查找并使用它是否存在locale于每个已安装的应用程序中的目录INSTALLED_APPS.首先出现的优先级高于后来出现的优先级.
  3. 最后,Django提供的基本翻译django/conf/locale用作后备.

我们可以看到订单在这里也很重要.

示例3管理命令:

从Django 1.7发布有关管理命令和顺序的说明INSTALLED_APPS:

当多个应用程序提供具有相同名称的管理命令时,Django会从首先出现的应用程序加载命令INSTALLED_APPS.以前的版本从最后出现的应用程序加载了命令.

这使管理命令的发现与Django的其他部分一致,这些部分依赖于INSTALLED_APPS静态文件,模板和翻译等顺序.

  • 这似乎与我所见过的关于应用程序订购的所有其他解释均相符,但与我的经验不符。Django的核心应用程序和其他可重用应用程序定义了可以覆盖的默认模板,但是大多数开发人员遵循设置“ INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS”的约定。根据示例1中的描述,这些替代实际上不会对这些应用程序生效,因为本地应用程序(通常)是最后列出的,但是根据我的经验并不是这样。 (2认同)