一、概述:
django基礎入手:
django建立project:#django-admin startproject mysite
建立一個app,名叫demo:#cd mysite; pythone manage.py startapp demo
把我們新定義的app加到settings.py中的INSTALL_APPS中
修改 mysite/mysite/settings.py
ROOT_URLCONF = 'openstack_dashboard.urls' -- 檢視綁定的urls (openstack_dashboard/urls.py)
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'demo', --here
)
備注,這一步是幹什麼呢? 建立的 app 如果不加到 INSTALL_APPS 中的話, django就不能自動找到app中的模闆檔案(app-name/templates/下的檔案)和靜态檔案(app-name/static/中的檔案)
類比一下:
my_horizon(應該叫horizon)目錄下的openstack_dashboard 相當于第二層的mysite;而horizon/horizon相當于demo
第二層的horizon被導入到my_horizone/openstack_dashboard/settings.py中,則根據py特性,Python中在導入一個包時,實際上導入了它的__init__.py檔案,當我們導入Horizon這個包的時候,__init__.py檔案自動運作,在__init__.py 檔案中再導入其他的包,或者子產品。其中在horizon包的__init__.py檔案中,此時應該看my_horizon/horizon/__init__.py的這個檔案;
跳轉到horizon.base.py
horizon/base.py,不足 1000 行,整體架構的核心,從這裡出發去探索。一個程序隻有一個 Site,一個 Site 有多個 Dashboard,一個 Dashboard 有多個 PanelGroup,一個 PanelGroup 有多個 Panel。 而 PanelGroup 的功能很弱,隻是把下面的 Panel 組合了一下,Dashboard 的 _registerable_class 是 Panel。url 是 lazy 加載的方式,隻有在第一次通路時才加載;