一、概述:
django基礎入手:
django新建project:#django-admin startproject mysite
1 生成如下目錄: 2 mysite 3 ├── manage.py 4 └── mysite 5 ├── __init__.py 6 ├── settings.py 7 ├── urls.py 8 └── wsgi.py
創建一個app,名叫demo:#cd mysite; pythone manage.py startapp demo
1 則生成如下目錄: 2 demo/ 3 ├── __init__.py 4 ├── admin.py 5 ├── models.py 6 ├── tests.py 7 └── views.py
把我們新定義的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 加載的方式,只有在第一次訪問時才加載;