openstack之horizon源码分析之二
一、概述:
django基础入手:
django新建project:#django-admin startproject mysite
生成如下目录:
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
创建一个app,名叫demo:#cd mysite; pythone manage.py startapp demo
则生成如下目录:
demo/
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── 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 加载的方式,只有在第一次访问时才加载;
openstack之horizon源码分析之二的更多相关文章
- openstack之horizon源码分析
一.基础准备: Horizon是基于django webframework开发的标准的Python wsgi程序,django的设计专注于代码的高度可重用,信奉DRY原则,一切面向对象,而Horizo ...
- horizon源码分析(一)
源码版本:H版 一.写在前面 本来应该搭建horizon的development环境的,这样方便debug,但是由于各种报错,本人没有搭建成功,这也导致有很多源码疑问没有解决,后续可以继续补充这一部分 ...
- DataTable源码分析(二)
DataTable源码分析(二) ===================== DataTable函数分析 ---------------- DataTable作为整个插件的入口,完成了整个表格的数据初 ...
- 一个普通的 Zepto 源码分析(二) - ajax 模块
一个普通的 Zepto 源码分析(二) - ajax 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块,以 ...
- Zepto源码分析(二)奇淫技巧总结
Zepto源码分析(一)核心代码分析 Zepto源码分析(二)奇淫技巧总结 目录 * 前言 * 短路操作符 * 参数重载(参数个数重载) * 参数重载(参数类型重载) * CSS操作 * 获取属性值的 ...
- Koa源码分析(二) -- co的实现
Abstract 本系列是关于Koa框架的文章,目前关注版本是Koa v1.主要分为以下几个方面: Koa源码分析(一) -- generator Koa源码分析(二) -- co的实现 Koa源码分 ...
- Unity时钟定时器插件——Vision Timer源码分析之二
Unity时钟定时器插件——Vision Timer源码分析之二 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面的已经介绍了vp_T ...
- Tomcat源码分析(二)------ 一次完整请求的里里外外
Tomcat源码分析(二)------ 一次完整请求的里里外外 前几天分析了一下Tomcat的架构和启动过程,今天开始研究它的运转机制.Tomcat最本质就是个能运行JSP/Servlet的Web ...
- spark 源码分析之二十一 -- Task的执行流程
引言 在上两篇文章 spark 源码分析之十九 -- DAG的生成和Stage的划分 和 spark 源码分析之二十 -- Stage的提交 中剖析了Spark的DAG的生成,Stage的划分以及St ...
随机推荐
- CURL 宏定义列表
摘自http://blog.csdn.net/msda/article/details/38047809/ CURL 宏定义列表 列表CURL库一共有17个函数 curl_close:关闭CURL会话 ...
- Hibernate缓存、组件、继承映射
Hibernate缓存.组件.继承映射 三种状态: 临时状态:不受session管理,没有提交到数据库:没有执行sql之前,new对象的时候: 持久化状态:受session管理,提交到数据库:正在执行 ...
- UML的基本关联
First, a dependency is a semantic relationship between two model elements in which a change to on ...
- 【(阶乘的质因数分解)算组合数】【TOJ4111】【Binomial efficient】
n<=10^6 m<=10^6 p=2^32 用unsigned int 可以避免取模 我写的SB超时 阶乘分解代码 #include <cstdio> #include &l ...
- 【MFC学习笔记-作业8-蝴蝶飞~】【什么鬼作业】
作业要求: 用定时器控制蝴蝶在窗口废物,如图所示... 这是什么鬼作业啊...蝴蝶还要我这个手残手画啊233333333 (ノಠ .ಠ)ノ彡┻━┻ 不过多亏之前几个鬼作业的福 收获颇 ...
- hdu 4709 Herding hdu 2013 热身赛
题意:给出笛卡尔坐标系上 n 个点,n不大于100,求出这些点中能围出的最小面积. 可以肯定的是三个点围成的面积是最小的,然后就暴力枚举,计算任意三点围成的面积.刚开始是求出三边的长,然后求面积,运算 ...
- C++ Primer 读书笔记:第10章 关联容器
第10章 关联容器 引: map set multimap multiset 1.pair类型 pair<string, int> anon anon.first, anon.second ...
- Struts学习之ValueStack学习
1. 数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL OGNL是Struts2中使用的一种表达式语言,它可 ...
- DBI && MySQL lock
DBI: url set isolation to dirty read my $npmdb_dbh = DBI->connect("DBI:ODBC:npmdb", &qu ...
- 关于Application Cache
http://blog.csdn.net/fwwdn/article/details/8082433 http://www.cnblogs.com/blackbird/archive/2012/06/ ...