iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 7
1
Modern Web

From Django 1.11 to Django 2.1 系列 第 7

Day7 : 探討 INSTALLED_APPS

邁入Day7! 今天就來些輕鬆一點的內容吧

今天我們來談談在 Day5 提到的 INSTALLED_APPS 內的寫法,其實也蠻tricky的這個議題

如果你依稀記得 Day6 的 vendor,要 Django 追蹤的方法就是將 vendor.apps.VendorConfig,加入 INSTALLED_APP

到這裡都沒有問題!

但是小弟我剛開始在學的時候,參考的來源不只一個網站,然後發現大家寫法不同,但是卻都能夠執行!

這是什麼意思呢? 也就是說 Day6 的 INSTALLED_APP,你可以這樣寫

INSTALLED_APPS = [
    'vendor',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

你可以使用更簡單的寫法 app name - 也就是將 vendor.apps.VendorConfig 替換成 vendor

阿你就會開始疑惑說 : 這麼簡單的寫法為什麼不直接告訴我就好了!!

沒有不告訴你啊,剛剛不是講了嗎 ^^"

A list of strings designating all applications that are enabled in this Django installation. Each string should be a dotted Python path to:

  • an application configuration class (preferred)
  • a package containing an application

所以說,其實這兩種寫法都可以,但是推薦你使用 vendor.apps.VendorConfig

這也算是 版本演化 下的一個產物

在 Django 1.9以前,下 python manage.py startapp [someapps]是不會自動產生 apps.py 在該app資料夾底下的,而你去打開 vendor 底下的 apps.py 便可以看到

from django.apps import AppConfig

class VendorConfig(AppConfig):
    name = 'vendor'

而上述的敘述要搭配著下面這一段文字看

When INSTALLED_APPS simply contains the dotted path to an application module, Django checks for a default_app_config variable in that module.
If it’s defined, it’s the dotted path to the AppConfig subclass for that application.
If there is no default_app_config, Django uses the base AppConfig class.

也就是說,我們託付給 Django 管理 apps,它的運作模式就是去看該路徑是否有 default_app_config 這個變數,如果有這個變數,才會繼續去看後面所接的路徑,很抽象對吧,直接帶你看一個例子

我們來到內部的 ithome\settings.py,來追 INSTALLED_APPS 的設定 django.contrib.admin

該檔案在虛擬環境 Django 套件下
cd .(你的目錄).\ithome\ithome_enve\Lib\site-packages\django\contrib\admin


省略部分內容 ...
def autodiscover():
    autodiscover_modules('admin', register_to=site)
    
default_app_config = 'django.contrib.admin.apps.AdminConfig'

在 __init__.py 你便可以看到這個設定,抓到 default_app_config,我們再繼續追 apps.AdminConfig

from django.apps import AppConfig
from django.contrib.admin.checks import check_admin_app, check_dependencies
from django.core import checks
from django.utils.translation import gettext_lazy as _

class SimpleAdminConfig(AppConfig):
...省略

class AdminConfig(SimpleAdminConfig):
    """The default AppConfig for admin which does autodiscovery."""

    def ready(self):
        super().ready()
        self.module.autodiscover()

trace到這邊,相信大家就會很明瞭了 ^^

大致上就是這樣,文章上面也強調,這是時代下演化出的產物,所以在 Django 1.7 以前這些內容都已經固定了,所以這些功能就只是取決於我們要不要使用,而不用去動它們

但是現在呢

New applications should avoid default_app_config. Instead they should require the dotted path to the appropriate AppConfig subclass to be configured explicitly in INSTALLED_APPS.

我們應該避免使用單純 app 的名稱,或是在 __init__.py 建立default_app_config = vendor.apps.VendorConfig

而是採用更明確的方式,在 settings.py 的 INSTALLED_APPS 加入 [someapp].apps.[SomeApps]Config

當然, INSTALLED_APP 還有更多功能可以玩,不過今天主軸擺在 探討 INSTALLED_APPS

希望這篇內容能夠釐清也在這探討INSTALLED_APPS寫法的人^^

參考資源
釐清polls.apps.PollsConfig 及 polls (1)
釐清polls.apps.PollsConfig 及 polls (2)

stackoverflow裡有無數的巨人,而自己也朝著成為巨人的路邁進 From BY


上一篇
Day6 : 資料庫的創建 - Models
下一篇
Day8 : 創建管理員 - Admin
系列文
From Django 1.11 to Django 2.1 30

1 則留言

0
jktruimp1
iT邦新手 5 級 ‧ 2019-02-18 13:30:08

您好,我在INSTALLED_APPS打vendor.apps.VendorConfig反而會得到這個error
has no attribute 'vendor'
但直接打vendor就過了0.0
不知道是不是架構和您不一樣的原因?看您的架構是manage.py 在\ithome\ithome下
但我的manage.py是在\ithome下

我也跟您是一樣處境,雖然不知道原因,但好像登入是沒問題的QWQ (後續再新增時多少有點問題,但還是無法釐清是否與這些有關係QWQ (好難Q.Q

我要留言

立即登入留言