应用顺序在INSTALLED_APPS中的重要性



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

from base import * 

,然后重写一些设置。同样在我的base.py中,我使INSTALLED_APPS成为一个列表,而不是一个元组。因为我想删除一些production设置的应用程序。在production.py我想写:

NOT_USED_APPS = ['debut_toolbar', 'other_odd_app',]
INSTALLED_APPS = list(set(INSTALLED_APPS) - set(NOT_USED_APPS))

在这种情况下,INSTALLED_APPS中的应用程序顺序与base.py中的不同

是的,顺序很重要。

来自Django官方文档关于INSTALLED_APPS设置:

当几个应用程序提供相同的不同版本时资源(模板、静态文件、管理命令、翻译)、在INSTALLED_APPS中首先列出的应用程序具有优先级。

示例1模板:

django.template.loaders.app_directories.Loader

如果这个模板加载器在你的DjangoTemplates后端在TEMPLATES设置中被启用,或者如果你把它作为一个loaders参数传递给Engine,那么它会从Django应用程序的文件系统中加载模板。

对于INSTALLED_APPS中的每个应用程序,加载器寻找一个模板子目录。如果该目录存在,Django将在其中查找模板。

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

INSTALLED_APPS = ('myproject.app1', 'myproject.app2')

现在,我想得到模板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

它将使用它首先找到的那个

引用那一段:

INSTALLED_APPS的顺序是显著的!

示例2:翻译

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

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

我们可以看到顺序在这里也很重要。

示例3管理命令:

来自Django 1.7发布说明中的管理命令和INSTALLED_APPS的顺序:

当多个应用程序提供相同的管理命令时name时,Django会从最先出现的应用程序中加载命令在INSTALLED_APPS。控件加载命令最后一个应用程序

这使得管理命令的发现与其他部分一致依赖于INSTALLED_APPS顺序的Django,比如static文件、模板和翻译

我做了一些实验,发现了另外两件我认为有用的事情:

  1. INSTALLED_APPS中的顺序似乎在模型创建时不起作用。Django发现某些模型依赖于其他模型,并以正确的顺序运行它们。

  2. 应用程序在AppConfig对象中的ready方法似乎按照它们在INSTALLED_APPS中出现的顺序运行。

最新更新