openstack horizon开发第一天
horizon插件构造
创建一个dashboard
mkdir opesntack_dashboard/dashboards/mydashboard
python manage.py startdash mydashboard --target=openstack_dashboard/dashboards/mydashboard 创建一个panel
mkdir opesntack_dashboard/dashboards/mydashboard/mypanel
python manage.py startpanel mypanel --target=openstack_dashboard/dashboards/mydashboard/mypanel 目录结构
mydashboard/
├── dashboard.py
├── __init__.py
├── mypanel
│ ├── __init__.py
│ ├── forms.py #表单生成类
│ ├── tables.py #表格生成类
│ ├── tabs.py #调用表格生成类(获取数据糅合tables,模板.数据)
│ ├── urls.py #url路由关系
│ ├── views.py #视图函数
│ ├── panel.py #panel关系文件
│ ├── templates #模板文件
│ │ └── mypanel
│ │ ├── _create_snapshot.html
│ │ ├── create_snapshot.html
│ │ └── index.html
├── static 静态文件目录
│ └── mydashboard
│ ├── js
│ │ └── mydashboard.js
│ └── scss
│ └── mydashboard.scss
└── templates
└── mydashboard
└── base.html 1.dashboard.py文件(注册horizon页面dashboard文件)
from django.utils.translation import ugettext_lazy as _
import horizon
class Mygroup(horizon.PanelGroup): #子项目(panel组)类
name = _("My Group") #组名称
slug = "mygroup" #唯一标识符
panels = ('mypanel',) #组下的panel class Mydashboard(horizon.Dashboard): #dashboard类
name = _("My Dashboard") #dashboard名称
slug = "mydashboard" #唯一标识符
panels = (Mygroup,) # 添加子项目
default_panel = 'mypanel' # 添加默认显示项目 horizon.register(Mydashboard) #注册dashboard 2.tables.py文件(生成tables模型) 数据模型model
from django.utils.translation ipmort ugettext_lazy as _
from horizon import tables
class MyFilterAction(tables.FilterAction): #表格过滤类
name='myfilter' #定义这个类的名称 class InstancesTable(tables.DataTable):
#'name'检索数据,verbose_name 数据列显示的名称
name=tables.Colum('name',verbose_name=_('Name')) #name表格字段
status=tables.Colum('status',verbose_name=_('Status')) #状态字段
zone=tables.Colum('zone',verbose_name=_('Zone')) 可用域字段
image_name=tables.Colum('image',verbose_name('Image')) 镜像字段 class Meta(object): #源数据类(instances表的元对象)
name='instances' #定义这个类的名称
verbose_name=_('Instancees') #表的名称
table_actions=(MyFilterAction,) #这个表的动作,执行MyFilterAction动作 3.tabs.py文件(tables的视图文件) 数据视图views(伪视图类)
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions #错误调用api日志输出
from horizon import tabs
from openstack_dashboard import api
from openstack_dashboard.dashboards.mydashboard.mypanel import tables class InstanceTab(tabs.TableTab): #获取实例数据类
name = _("Instances Tab") #定义了这个视图类名称
slug = "instances_tab" #唯一标识符
table_classes = (tables.InstancesTable,) #需要使用的table模型
template_name = ("horizon/common/_detail_table.html") #需要使用的tempalte模板(_detail_table分页tables模板)
preload = False #数据的加载方式(默认使用api,True使用Ajax) def has_more_data(self, table):
return self._has_more def get_instances_data(self):
try:
marker = self.request.GET.get(
tables.InstancesTable._meta.pagination_param, None) #获取当前传递的分页参数 #获取实例列表search_opts,marker页数,paginate是否分页,返回实例列表和带有tenant信息的request
instances, self._has_more = api.nova.server_list(
self.request,
search_opts={'marker': marker, 'paginate': True}) return instances
except Exception: #获取失败返回
self._has_more = False
error_message = _('Unable to get instances')
exceptions.handle(self.request, error_message) return [] class MypanelTabs(tabs.TabGroup): #tabs组类
slug = "mypanel_tabs" #唯一标识符
tabs = (InstanceTab,) #这个组存在的tab
sticky = True #是否处理tables生成tables页面 4.views.py真正的views文件(总视图文件)
from horizon import tabs
from openstack_dashboard.dashboards.mydashboard.mypanel \
import tabs as mydashboard_tabs class IndexView(tabs.TabbedTableView): #tabs试图类
tab_group_class = mydashboard_tabs.MypanelTabs #所使用的tab视图类
template_name = 'mydashboard/mypanel/index.html' #所使用的总模板 def get_data(self, request, context, *args, **kwargs):
# Add data to the context here...
return context 5.urls.py(url路由处理文件)
from django.conf.urls import url
from openstack_dashboard.dashboards.mydashboard.mypanel import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
] 6.index模板文件(template模板)
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "My Panel" %}{% endblock %} {% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("My Panel") %}
{% endblock page_header %} {% block main %}
<div class="row">
<div class="col-sm-12">
{{ tab_group.render }} #嵌入tab视图函数的模板(_detail_table.html)
</div>
</div>
{% endblock %} 7.编辑enable文件动态加载dashboard(文件名称_50_mydashboard.py) #添加dashboard到horizon
DASHBOARD = 'mydashboard' #设置settings.disabled
DISABLED = False #添加项目路径到app中
ADD_INSTALLED_APPS = [
'openstack_dashboard.dashboards.mydashboard',
] 8.重新运行horizon
python manage.py runserver 0:8001
参考文档 https://docs.openstack.org/horizon/latest/contributor/tutorials/dashboard.html
openstack horizon开发第一天的更多相关文章
- openstack horizon 开发第三天
工作流:工作流是带有选项的复杂表单,每个工作流必须包含扩展Workflow, Step和的类Action1. url.py 路由处理 RESOURCE_CLASS = r'^(?P<resour ...
- openstack horizon 开发第二天
依照上次的简单的仪表盘添加动作额外添加或修改的文件mydashboard/├── mypanel│ ├── forms.py│ ├── tables.py│ ├── templates│ ...
- python开发第一篇:初识python
一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...
- openstack horizon 学习(3) DataTable
上一篇中粗略的讲了下openstack中horizon的dashboard和panel的添加,本打算在这章中对有关于pluggable settings中的配置做详细的总结,然放弃了这念头.原因是搞懂 ...
- Electron-使用Electron开发第一个应用
使用Electron开发第一个应用 Electron 应用的目录结构如下: app/ ├── package.json ├── main.js └── index.html 新建一个app文件夹 将这 ...
- Cordova - 使用Cordova开发iOS应用实战1(配置、开发第一个应用)
Cordova - 使用Cordova开发iOS应用实战1(配置.开发第一个应用) 现在比较流行使用 html5 开发移动应用,毕竟只要写一套html页面就可以适配各种移动设备,大大节省了跨平台应用的 ...
- iOS开发——高级技术精选&底层开发之越狱开发第一篇
底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章05
1.3 开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程 ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章04
1.2.3 Windows Workflow运行时 从Windows Workflow的角度看,可以将工作流活动当成是交给一个工作流处理器去执行的一系列指令或操作码.在Windows Workflo ...
随机推荐
- 切换composer国内镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
- Codeforces 1106 E. Lunar New Year and Red Envelopes 优先队列+dp
题意大致是Bob新年拿红包,每个红包可以在s-t时间内取,但是取了之后得在d+1时间开始才能继续取红包. 同时他女儿能在m个时间点阻止他取红包,求女儿阻止后Bob取得的w总和最小值. Bob取红包的策 ...
- boost的初步了解
本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心. 名字本身就说明了一切:Asio 意即异步输入/输出. 该库可以让 C++ 异步地处理数据,且平台独立. 异步数据处理就是指,任务 ...
- Linux禁用root账户ssh登录
前言 今天登录服务器的时候,控制台输出如下信息 There were 48990 failed login attempts since the last successful login. Last ...
- python apsheduler cron 参数解析
from:https://apscheduler.readthedocs.io/en/v2.1.2/cronschedule.html Cron-style scheduling This is th ...
- C++垃圾回收器的实现
一.简单介绍 这是一个自己写C++垃圾自己主动回收器,用到的都是标准C++语法.採用了引用计数加mark-sweep的方法.在没有循环引用的情况下,引用计数能够保证垃圾实时得到回收:对于有循环引用的情 ...
- iOS开发用如何用类"SKStoreProductViewController"跳转AppStore点赞评分?
大家都知道,评论和评分是决定app在appstore中排名的重要因素,但是大部分用户下载安装APP后却不会去点评,所以添加提示用户去点评的功能是很必要的. 目前,AppStore点赞评分有两种方法,一 ...
- Delphi的idhttp报508 Loop Detected错误的原因
一般是访问https时才出现“508 Loop Detected”,idhttp+IdSSLIOHandlerSocketOpenSSL,这个在上篇文章中讲过了. 由于该问题网上资料极少,连外文资料也 ...
- Scala中=>的用法
1. 表示函数的类型(Function Type) 例如: def double(x: Int): Int = x*2 函数double的类型就是 (x: Int) => Int 或者 Int ...
- OpenStack入门篇(九)之nova服务(控制节点)的部署与测试
1.Nova介绍 Nova是openstack最早的两块模块之一,另一个是对象存储swift.在openstack体系中一个叫做计算节点,一个叫做控制节点.这个主要和nova相关,我们把安装为计算节点 ...