horizon启动过程
主要的文件是:
openstack_dashborad.urls.py(OpenStack Dashboard的URL patterns)、
openstack_dashborad.settings.py(配置文件)、
horizon.base.py(基础库)
base.py实现了一套dashboard/panel注册、动态加载机制,使得Horizon面板上所有的dashboard都是”可插拔”的,所有的panel都是”动态加载”的
-1、horizon.base.Site._lazy_urls(self)返回一个函数LazyURLPattern(url_patterns),参数为horizon.base.Site._lazy_urls.url_patterns()方法。
0、开始请求horizon
1、根据Django内部规则,先获取URL,从openstack_dashboard.urls.py中的patterns容器中取到url(r'', include(horizon.urls))。
2、URL认证,设置openstack_auth.urls,include(openstack_auth.urls)时会执行horizon.base.Site._lazy_urls.url_patterns()方法。
3、horizon.base.Site._lazy_urls.url_patterns()方法返回horizon.Site._urls()
4、horizon.base.Site._urls()获取urlpatterns值,使用 horizon.base.HorizonComponent._get_default_urlpatterns(self)方法
5、horizon.base.Site._autodiscover()遍历settings.INSTALLED_APPS发现dashboard和panel,执行每个APP下的dashboard.py和panel.py。
6、horizon.base.Site._autodiscover()把所有获取到的dashboard都注册,存放到_registry中。
注册是openstack_dashboard.dashboards.project.dashboards.py中的horizon.register(Project)注册。
7、dashboard注册过程:horizon.base.Site.register(self, dashboard)使用horizon.base.Registry._register(self, cls)注册一个dashboard类,返回一个类对象并实例化一个dashboard类。
9、horizon.base.Dashborad._autodiscover()迭代panel,转化成PanelGroups并实例化PanelGroups。
加载PanelGroups中的panel,然后注册。
10、panel注册过程:
horizon.base.Dashborad.register(cls, panel)
调用horizon.base.Site.register_panel(self,dashborad,panel),然后加载panel相关的templates,
horizon.base.Site.register_panel(self,dashborad,panel)-->
horizon.base.Site.registered(self,dashborad)-->
horizon.base.Registery._registerd(self,cls)返回一个dashboard对象
panel注册结束.
11、加载基于插件的panel配置,horizon.base.Site._load_panel_customization()以插件为基础的panel配置,支持添加、删除和设置默认面板仪表板。
它还支持注册一个面板组。
它调用horizon.base.Site._conf(self)获取配置,返回里实例化了的horizon.conf.__init__.LazySettings()设置类。
12、根据注册的值,编译动态URLconf配置。
返回urlpatterns, self.namespace, self.slug这三个值,分别是URL、名字、slug。
总结:
开始请求horizon之前先把URL传入,准备好。
请求后,获取urlpatterns值(URL),
根据urlpatterns值获取配置文件中的INSTALLED_APPS容器,
根据容器中的配置注册dashborad,再根据dashborad注册该dashborad下的panel(最复杂的部分)。
最后载入panel的插件和配置。