首页 > 数据库技术 > 详细

cmdb项目-3

时间:2019-09-29 14:47:12      阅读:74      评论:0      收藏:0      [点我收藏+]

1. cmdb资产审计

 

2.stark组件使用

  快速完成网站的一个组件,使用方式与django的admin系统类似 ,仅仅将model注册 ,就可以生成对model增删改查的页面 ,当然这里还包括了模糊搜索 ,排序 ,批量操作等等

  1)拷贝并注册stark应用到项目中(settings)

  2)在根url.py中注册stark组件的url 

from django.conf.urls import url, include
from django.contrib import admin
from stark.service.stark import site

urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^api/, include(api.urls)),
    url(r^stark/, site.urls),
]

  3)以业务线为例, 使用stark组件的部分功能

    list_display =  []          # 看了下源码 ,列表中主要放函数与字段 ,如果是函数的话就把从数据库拿到的queryset数据拿来循环 ,如果是字段就返回html展示

    search_list = []           # 允许用哪些字段作为搜索条件 

    order_by = []            # 以某个字段排序 ,升序 ,可以加负号完成反向排序

    action_list = []             # 下拉操作列表选项 ,组件中有multi_delete方法完成批量删除 ,也可以自己定义方法(如批量更新 ,可以在request.POST中选择pk ,再通过model操作进行更新)

    def 定义函数 ,或者重写已有函数

    site注册model ,并添加配置类

##stark.py注册model文件
1.定义配置类
class BusinessUnitConfig(StarkConfig):
    list_display = [StarkConfig.display_checkbox, id, name]
    search_list = [id, name]
    order_by = [-id]

    def multi_apply(self, request):
        print(request.POST)
        return redirect(http://www.baidu.com)

    multi_apply.text = 批量更新

    action_list = [StarkConfig.multi_delete,multi_apply]

2.应用配置类 ,注册到stark
site.register(models.BusinessUnit, BusinessUnitConfig)

  4)以Server服务器为例 ,使用stark组件的部分功能

    list_display = []        # 展示choice字段 ,需要定义一个函数指定标题头部 

###server的model中device_status_id这个字段
device_status_choices = (
    (1, 上架), (2, 在线),  (3, 离线),  (4, 下架),
)
device_status_id = models.IntegerField(choices=device_status_choices, default=1)

       方法1:自定义函数 ,返回html代码段 ,对于choice状态不同的id展示不同的颜色 ,在list_display中直接写上函数名即可

       方法2:使用get_choice_text( ‘字段‘ ,标题头)

class ServerConfig(StarkConfig):

    # row是orm对象 ,可以展示choices的内容
    def show_status(self, header=None, row=None):
        if header:
            return 状态
        color = {
            1: red,
            2: green,
            3: blue,
            4: yellow
        }
        # return row.get_device_status_id_display()
        return mark_safe(<span style="color:{}">{}</span>.format(color.get(row.device_status_id),
                                                                   row.get_device_status_id_display()))

    list_display = [id, hostname, show_status, os_platform, os_version,‘business_unit‘, get_choice_text(device_status_id, 状态2)]

    search_list = []      #如果以表中某一个外键为搜索条件, 例如服务器的外键业务线的名称 ?上下滑直接指定即可

    search_list = [hostname, os_version, business_unit__name]

    list_filter = []       # 快速检索 ,以按钮的形式将条件展示 ,如果选中拿出对应的pk在filter中组合筛选 (search_list与list_filter两个会联合查询)

      list_filter组合搜索展示choice字段的按钮 ,该字段必须有choice ,text_func与value_func必须使用匿名函数 ,匿名函数的参数就是choices元祖的每一个值

    list_filter = [
        Option(business_unit, is_multi=True),
        # lambda中的x是(1:‘上线‘)   text_func是文本显示结果   value_func是url上对应的值 要对应
        Option(device_status_id, is_multi=True, is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0])
    ]

  5)bootstrap的datetimepicker日历时间选择器(为一些填写时间的字段增加体验)  (https://www.jianshu.com/p/48b2343ded54更多功能)

    首先需要自己写modelform并继承stark的modelform ,为生成时间字段增加date-picker类名称

    然后在配置类中引用自定义的modelform

    其次加载js与css文件即可

class ServerModelForm(StarkModelForm):
    class Meta:
        model = models.Server
        fields = "__all__"
        widgets = {
            latest_date: DatePickerInput(attrs={class: date-picker})
        }


class ServerConfig(StarkConfig):
    model_form_class = ServerModelForm
...

   6)扩展功能 ,stark注册一个model ,生成增删改查资格url与对应的视图函数 ,但是扩展的功能想自定义的功能如何去完成 ?

   扩展功能1.增加显示服务器详情(硬盘内存网卡信息)   2.增加服务器审计信息展示

     在配置类定义url ,通过extra_url()函数实现

     在配置类定义视图函数 

     在配置类定义每行显示的标签以及跳转url

技术分享图片
class ServerConfig(StarkConfig):
    model_form_class = ServerModelForm

    def server_detail(self, request, pk):
        server_disks = models.Disk.objects.filter(server_id=pk).order_by(slot)
        server_memorys = models.Memory.objects.filter(server_id=pk)
        server_nics = models.NIC.objects.filter(server_id=pk)

        return render(request, server/server_detail.html,
                      {server_disks: server_disks,
                       server_memorys: server_memorys,
                       server_nics: server_nics, })

    def server_record(self, request, pk):
        server_record = models.AssetRecord.objects.filter(server_id=pk)

        return render(request, server/server_record.html,
                      {server_record: server_record,
                       })

    def extra_url(self):
        from django.conf.urls import url
        urlpatterns = [
            url(r^server_detail/(\d+)/, self.server_detail),
            url(r^server_record/(\d+)/, self.server_record),
        ]
        return urlpatterns

    def show_detail(self, header=None, row=None):
        if header:
            return 主机详情
        return mark_safe(<a href="/stark/api/server/server_detail/{}">查看</a>.format(row.pk))

    def show_record(self, header=None, row=None):
        if header:
            return 审计
        return mark_safe(<a href="/stark/api/server/server_record/{}">查看</a>.format(row.pk))

    # row是orm对象 ,可以展示choices的内容
    def show_status(self, header=None, row=None):
        if header:
            return 状态
        color = {
            1: red,
            2: green,
            3: blue,
            4: yellow
        }
        return mark_safe(<span style="color:{}">{}</span>.format(color.get(row.device_status_id),
                                                                   row.get_device_status_id_display()))

    list_display = [id,
                    hostname,
                    show_status,
                    os_platform,
                    os_version,
                    business_unit,
                    get_choice_text(device_status_id, 状态2), show_detail, show_record]

    search_list = [hostname,
                   os_version,
                   business_unit__name]

    list_filter = [
        Option(business_unit, is_multi=True),
        # lambda中的x是(1:‘上线‘)   text_func是文本显示结果   value_func是url上对应的值 要对应
        Option(device_status_id, is_multi=True, is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0])
    ]
View Code

 

 

3.stark功能总结

  1)注册model ,生成4个url ,以及4个视图函数

    /stark/应用名/model名/(增删改查)

  2)展示页面的功能

    展示字段 (普通字段 ,choices字段 ,外键字段)

    模糊搜索

    自定义方法

    批量操作

    组合搜索(快速筛选)

    分页

    扩展功能(url)

    保留搜索条件(分页 ,搜索条件在新增编辑时候都保留)

    新增编辑可以自定义modelform与datepicker插件

 

4.stark组件的部分功能源码解读

6. 实现的机制
  1). 注册APP ‘stark.apps.StarkConfig‘,
    django的ready函数   ——》 app目录下找stark.py并执行  
    stark.py导入site对象
    site.register(model的类,配置类)
    实例化一个 Mapping的对象 (model的类,配置对象(model的类, site的对象) )
      class ModelConfigMapping(object):

        def __init__(self, model, config, prev):
          self.model = model
          self.config = config
          self.prev = prev

    site._registry是个列表里面全是mapping对象[ Mapping的对象 ]

  2). stark的路由(多重使用django的url函数进行分发!)
    url(r‘stark/‘, site.urls)
    r‘stark/‘,( [] ,app_name,namespace )

      url(r‘api/server/‘,( [], ))

        api/server/list/
        api/server/add/
        api/server/(?P<pk>\d+)/change/
        api/server/(?P<pk>\d+)/del/

      根据一个model至少生成4个url地址(包括extra扩展的url)

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

cmdb项目-3

原文:https://www.cnblogs.com/quguanwen/p/11526303.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!