Horizon二次开发

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

注:OpenStack Horizon项目与其它项目有所不同,它主要提供一套工具,我们可以自己定制开发我们想要的dashboard(控制面板)。

翻译自:http://docs.openstack.org/developer/horizon/topics/tutorial.html

本教程讨论如何使用Horizon中多样的组件(主要是tables和tabs)来建立一个dashboard和panel。


创建一个dashboard控制面板

注意:你可以创建一个panel而不是dashboard,然后整合它到一个已经存在的dashboard。

快速版本

Horizon提供了一套自定义管理命令来创建一个典型的基于dashboard的结构。下列命令产生了大部分的模板代码:

./run_tests.sh -m sstartdash mydashboard
非常推荐你阅读剩余的章节来了解这个命令创建了什么和为什么要创建。

结构

dashboard(或者panel)的推荐的结构适合于典型的Django应用布局,我们将我们的dashboard命名为My Dashboard”:

mydashboard
  |--__init__.py
  |--dashboard.py
  |--templates/
  |--static/
dashboard.py模块将通过使用Horizon包含我们要使用的dashboard类;templates和static目录分别是我们的Django模板文件和静态媒体文件。

在static和templates目录中,不错的命名空间应该像这样:

templates/
  |--mydashboard/
static/
  |--mydashboard/
     |--css/
     |--js/
     |--img/
在那些文件和目录的地方,我们可以继续写我们自己的dashboard类。

定义一个dashboard

一个dashboard可以极其简单,至少定义一个name(dashboard对外所呈现的名称)和一个slug(被其它组件引用的内部名称):

import horizon
 
class MyDashboard(horizon.Dashboard):
    name = _("My Dashboard")
    slug = "mydashboard"

在实践中,一个dashboard类通常包括更多信息,例如一系列的panels和任何访问dashboard的权限:

class MyDashboard(horizon.Dashboard):
    name = _("My Dashboard")
    slug = "mydashboard"
    panels = ('mypanel',)
    default_panel = 'mypanel'
    permissions = ('openstack.roles.admin'<span style="font-size:12px;">,)</span>

一旦我们的dashboard完成,我们需要做的就是注册它:

horizon.register(MyDashboard)
这个操作的典型的位置是dashboard.py文件的底部,但是它可以在任何的其他地方,例如在一个重写的文件中。


创建一个panel

现在我们已经有了我们写的dashboard,我们也可以创建我们的panel,我们将panel命名为“My Panel”。

注意:你不需要为了添加panel而去写一个dashboard,这个结构是为了保证教程的完整性。

快速版本

Horizon提供了一套自定义的管理命令来创建一个典型的基于panel的结构。下面的命令生成了大部分的模板代码:

./run_test.sh -m startpanel mypanel --dashboard=mydashboard --target=auto
dashboard参数是必选的,告诉命令panel注册的dashboard。target参数是可选的,auto意味着创建的panel文件应该在dashboard模块内相对于当前的目录(默认)。

非常推荐你阅读剩余的章节来了解这个命令创建了什么和为什么要创建。

结构

一个Panel是一个相对扁平的结构,继续我们的mydashboard/mypanel的例子,它们看起来应该是这样:

mypanel/
  |--__init__.py
  |--panel.py
  |--urls.py
  |--views.py
  |--templates/
     |--mypanel/
        |--index.html

定义一个panel

上面指定的panel.py文件有一个特殊的意义,在一个dashboard中,dashboard类中指定的"panels属性"列出任何模块名字,将自动在panel.py文件中查找相应的记录。

在panel.py模块中,我们定义我们的panel类:

class MyPanel(horizon.Panel):
    name = _("My Panel")
    slug = 'mypanel'

一旦定义了它,我们还需要在dashboard中注册它,通常在panel.py文件末尾:

dashboard.VizDash.register(MyPanel)

从之前构建的例子,我们可能想要定义一组panels共享主题,而且在导航上有一个子标题,我们将我们的panels组命名为“My Group”:

class MyGroup(horizon.PanelGroup):
    slug = "mygroup"
    name = _("My Group")
    panels = ('mypanel',)
PanelGroup可以添加到dashboard类的panels列表。


Tables,Tabs,Views

我们从table开始,把table和tab整合到一起,最后把它们统一合成到一个视图(view)中。

从高层次视图开始,我们最终的目标是创建一个视图(我们的IndexViex类),使用Horizon的DataTable类来展示数据,使用Horizon的TabGroup类来提供给用户一个分页式的展示方式。

我们先从table开始,整合它与tab,然后建立我们的视图。

定义一个table

Horizon提供了一个DataTable类,简化了绝大多数显示数据给最终用户的工作。这种情况下,我们使用table呈现数据,所以开始定义我们的table,一个table.py文件:

from django.utils.translation import ugettext_lazy as _
from horizon import tables

class InstancesTable(tables.DataTable):
    name = tables.Column("name",verbose_name=_("Name"))
    status = tables.Column("status",verbose_name=_("Status")
    zone = tables.Column('availability_zone',verbose_name=_("Availability Zone"))
    image_name = tables.Column('image_name',verbose_name=_("Image Name")

class Meta: 
    name = "instances"
    verbose_name = _("Instances")
 有几件事情发生了,我们创建了一个table子类,定义了四列。每列定义了它访问实例类的属性作为第一个参数,由于我们希望所有的事情都是可以被翻译的,我们给没列一个verbose_name标记它们可以被翻译。
最后我们添加了一个Meta类来定义一些描述table的元数据。 

向table添加action

Horizon提供了三种基本的可以呈现table数据的action类:

在基本的action的基础上,还提供了一些扩展的action类:

现在,我们创建并向table添加一个“filter action”。我们需要编辑上面的table.py文件,添加了“filter action”后,我们将只能看到filter域中规定的字段。先定义一个FilterAction类:

class MyFilterAction(tables.FilterAction):
    name = "myfilter"
然后,我们将这个action加入到table中:

class InstancesTable:
    class Meta:
        table_actions = (MyFilterAction,)

完整的table.py文件看起来应该是这样:

from django.utils.translation import ugettext_lazy as _

from horizon import tables


class MyFilterAction(tables.FilterAction):
    name = "myfilter"


class InstancesTable(tables.DataTable):
    name = tables.Column('name', \
                         verbose_name=_("Name"))
    status = tables.Column('status', \
                           verbose_name=_("Status"))
    zone = tables.Column('availability_zone', \
                         verbose_name=_("Availability Zone"))
    image_name = tables.Column('image_name', \
                               verbose_name=_("Image Name"))

    class Meta:
        name = "instances"
        verbose_name = _("Instances")
        table_actions = (MyFilterAction,)

定义tabs

因为我们有了table,可以接收数据,我们可以直接得到一个视图,这种情况下,我们同样适用Horizon的TabGroup类,它给我们一个干净、简化的tabs接口来显示我们的可视化数据。

整合table与tab:

from django.utils.translation import ugettext_lazy as _

from horizon import exceptions
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,)
    template_name =  ("horizon/common/_detail_table.html")
    preload = False

    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)

            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):
    slug = "mypanel_tabs"
    tabs = (InstanceTab,)
    sticky = True

 

这个tab有一点复杂。tab处理tables的数据(以及所有有关的特性),同时它可以使用preload属性来指定这个tab该不该被加载,默认情况下为不加载。当有人点击它时,它将通过AJAX方式加载,在绝大多数情况下保存我们的API调用。

把他们整合到一个视图(view)中

在Horizon中,有很多基于类的预建视图,我们试着给所有通用整合组件提供起始点。

这种情况我们想要一个起始的视图类型与tables和tabs一起工作,那应该是TabbedTableView类。它很好的动态延迟加载能力(tab group提供的并混合在actions中)和AJAX方式更新tables的能力,使得在用户端基本不用做任何工作。

代码看起来应该是这样:

from horizon import tabs

from openstack_dashboard.dashboards.mydashboard.mypanel \
    import tabs as mydashboard_tabs

class IndexView(tabs.TabbedTableView):
    tab_group_class = mydashboard_tabs.MypanelTabs
    template_name = 'mydashboard/mypanel/index.html'

    def get_data(self, request, context, *args, **kwargs):
        # Add data to the context here...
        return context

 

URLs

一个充满智慧的设想就是Panel类可以在url.py文件中被找到,我们定义一个叫做index的视图作为panel的默认处理视图,一个完整的url.py文件看起来应该是这样:

from django.conf.urls import patterns
from django.conf.urls import url

from openstack_dashboard.dashboards.mydashboard.mypanel import views


urlpatterns = patterns('',
    url(r'^$',
        views.IndexView.as_view(), name='index'),
)


Template(模板)

{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Mypanel" %}{% endblock %}

{% block page_header %}
    {% include "horizon/common/_page_header.html" with title=_("Mypanel") %}
{% endblock page_header %}

{% block main %}
<pre><div class="row">
   <div class="col-sm-12">
   {{ tab_group.render }}
   </div>
</div>
{% endblock %}

 如果你想更改index.html的title,你可以更改{% block title %}块中的内容。


openstack学习记录(一) horizon二次开发部署(juno) 在虚拟机中部署了openstack(juno)版本,想要在物理机上调试查看horizon代码,过程如下: 编译器 pycharm 系统环境 Ubuntu14.04 , python .version() 2.7.6 django.version() 1.6.11 若没有django,先安装好django框架一:下载juno版本对应的horizon源码网址:https://releases 阅读详情

相关推荐

openstack二次开发简介

openstack二次开发简介

Openstack -- Horizon二次开发(一)

Horizon二次开发Openstack官网上给出了一个Horizon二次开发是示例: http://docs.openstack.org/developer/horizon/tutorials/dashboard.html 可以按照官网上示例逐步进行,完成一个自己开发的dashboard。对mypanel中的views.py代码稍作修改:class IndexView(tabs.TabbedT

wushirenfei的博客 7661

关于云计算、openstack、Dashboard(horizon)的定制化

关于云计算、openstack、Dashboard(horizon)的介绍与定制化

Openstack Horizon二次开发

系统整体页面: 1.png(54.53 KB, 下载次数: 2) 下载附件保存到相册 2014-11-1 17:08 上传 代码结构:horizon采用django框架编写(django是一个强大的mvc 框架。具体参考djangobook中文版http://djangobook.py3k.cn/2.0/。)左侧面板布局:代码: vim /u...

weixin_30586085的博客 654

Openstack中Dashboard的二次开发

原文:Tutorial: Building a Dashboard using Horizon 除了原文中翻译的内容,还有自己添加的一部分内容 本教程讨论如何使用Horizon中多样的组件(主要是tables和tabs)来建立一个dashboard和panel,包括和后端的数据交互。做为一个例子,我将创建一个有一个实例标签的panel,这个标签有一个能和Nova的API进行数据交换的tab

在努力! 6287

Openstack -- Horizon二次开发(二)

tables.Actiontables.DataTable中会配合tables.Action使用,来快速开发出表格某些功能。官网中给出了一些常用的action: http://docs.openstack.org/developer/horizon/topics/tables.html?highlight=action 其中比较常见的有Action,FilterAction,和 LinkActi

wushirenfei的博客 2397

horizon二次开发

参考 1 http://www.aboutyun.com/thread-8892-1-1.html 这里对horizon结构有很好的描述 2 security部分的加强参考 https://blueprints.launchpad.net/horizon/+spec/security-group-rules 3 这个文档在fuel的版本里并无 run_tests.s

anzhuangguai的专栏 958

Horizon 二次开发 - 框架

horizon 二次开发 - 框架简介

猫影 1625

Horizon 二次开发-部署

openstack horizon 二次开发

猫影 2345

从模板到产品:Horizon ChatGPT AI Template二次开发5步走(多轮对话、新模型接入与主题定制)

Horizon ChatGPT AI Template 是一款基于 React、Next.js 与 Chakra UI 的开源 ChatGPT UI 模板与启动套件,内置 30+ 深色/浅色 UI 组件,可帮助你快速搭建 AI 聊天应用。本文面向新手,带你用 5 个步骤完成二次开发:跑通本地环境、升级多轮对话、接入 GPT-4o / GPT-3.5 等新模型,并定制专属主题色。 [![Horiz

gitblog_00536的博客 447

OpenstackHorizon在Dashboard上定制新页面

二次开发OpenstackHorizon在Dashboard上定制新页面前言:Horizon 提供可视化的 GUI 图形界面,让用户去操作这些项目使用的各种资源。那Horizon 的内部架构是怎么样的?我们如果要做二次开发,应该怎么去做?Openstack Horizon Dashboard 是一套基于Django Web 框架实现的Web界面。了解 Horizon 应首先去了解 Pytho...

spark_csdn的博客 3283

Horizon 二次开发 - 主题简单修改

Horizon 二次开发 - 主题简单修改

猫影 1986

Horizon 二次开发 - 登陆页面修改

Horizon 主题修改 - 登陆页面修改

猫影 1886

Openstack Horizon(kilo)二次开发之匿名访问View

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34026276的博客 275

Openstack二次开发,选择什么工具开发较好?

OpenStack二次开发时,选择合适的工具和框架非常重要。以下是一些流行的工具和框架,它们各自有不同的特点和优势:Python OpenStack Clients:这是最常用的工具之一,它提供了一个简单的接口来与OpenStack服务进行交互。使用Python OpenStack Clients,你可以轻松地执行各种操作...

weixin_40480281的博客 124

Openstack Horizon开发资料与案例

Openstack Horizon开发资料与案例

gsllovefly的博客 942
上一篇: python语言特性
下一篇: OpenStack配额(Quota)设计与实现
虚拟化现实
博客等级 码龄18年 57粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值