一、概述:

  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 加载的方式,只有在第一次访问时才加载;

转载于:https://www.cnblogs.com/chris-cp/p/6062628.html

openstack之horizon源码分析之二相关推荐

  1. Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)

    一.综述 HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作. 首先上一段代码,客户端是如何写文件的: ...

  2. Spring Cloud源码分析(二)Ribbon(续)

    因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...

  3. Koa源码分析(二) -- co的实现

    Abstract 本系列是关于Koa框架的文章,目前关注版本是Koa v1.主要分为以下几个方面: Koa源码分析(一) -- generator Koa源码分析(二) -- co的实现 Koa源码分 ...

  4. Flume 1.7 源码分析(二)整体架构

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

  5. redux源码分析之二:combineReducers.js

    欢迎关注redux源码分析系列文章: redux源码分析之一:createStore.js redux源码分析之二:combineReducers.js redux源码分析之三:bindActionC ...

  6. bytebuddy实现原理分析 源码分析 (二)

    bytebuddy实现原理分析 &源码分析 四.字节码的操作(implementation ) pkg 4.1 bytecode :pkg 4.1.1 StackManipulation :c ...

  7. kubelet源码分析(二)之 NewMainKubelet

    本文个人博客地址:https://www.huweihuang.com/kubernetes-notes/code-analysis/kubelet/NewMainKubelet.html kubel ...

  8. Raft源码分析(二) - Role转换

    时光粒子源码 分布式一致性/分布式存储等开源技术探讨, GitHub:raft | 时光粒子源码 Raft源码分析 - 关于 Raft源码分析(一) - State Raft源码分析(二) - Rol ...

  9. Android 双开沙箱 VirtualApp 源码分析(二)

    Android 双开沙箱 VirtualApp 源码分析(二) VA 初始化 先看一下代码: VirtualCore.startup public void startup(Context conte ...

最新文章

  1. openssl qt linux 安装,在Ubuntu 16.04.1上使用OpenSSL构建Qt失败
  2. C# 编码规范和编程好习惯
  3. 2021-04-09 linux的shell脚本简单教程
  4. C++golden section search黄金分割搜索的实现算法(附完整源码)
  5. 删除副本列表中的消失项目符号
  6. SAML request和response的一对典型例子,供将来参考
  7. Exchange系列之exchange2003sp2部署
  8. 用C++做一个通讯录管理系统(手把手教学)
  9. 防火墙状态检测及会话表技术
  10. python3 多线程爬去mzitu图片
  11. 企业软著申请流程 图文! 纯干货!
  12. 百度地图Web API Python模块
  13. 基于SpringBoot调用百度ocr以及企查查接口实现对营业执照信息的提取并识别真伪
  14. 【答学员问】面试问题-毕业时候为什么没有选择开发
  15. Java核心技术卷一基础知识第10版demo实例
  16. QT 如何实现QLabel的点击事件
  17. Stegano之StegSolve、StegDetect、InvisibleSecrets
  18. android MediaPlayer架构
  19. 基于Xlinx的时序分析、约束和收敛(2)----基础概念(上)
  20. CSS 文字超出部分省略号代替

热门文章

  1. Android之异步消息处理机制Handler源码解析
  2. synchronized和ReentrantLock区别
  3. iOS Core Bluetooth 基础知识
  4. python transformers_transformers 安装
  5. Nginx配置:nginx如何配置跳转fpm
  6. 解决标准FPGA资源丰富却浪费的问题
  7. 【scala】类的定义和单例对象
  8. JDBC——jdbcUtils加载配置文件赋值
  9. java-forkjoin框架的使用
  10. delphi 插入表格HTML代码