天天看點

openstack之horizon源碼分析之二

一、概述:

  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/中的檔案)

openstack之horizon源碼分析之二

   類比一下:

    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的這個檔案; 

openstack之horizon源碼分析之二

跳轉到horizon.base.py

openstack之horizon源碼分析之二

  horizon/base.py,不足 1000 行,整體架構的核心,從這裡出發去探索。一個程序隻有一個 Site,一個 Site 有多個 Dashboard,一個 Dashboard 有多個 PanelGroup,一個 PanelGroup 有多個 Panel。 而 PanelGroup 的功能很弱,隻是把下面的 Panel 組合了一下,Dashboard 的 _registerable_class 是 Panel。url 是 lazy 加載的方式,隻有在第一次通路時才加載;