CMDB项目中遇到的问题

客户端


类的调用

class Response(object):
    def __init__(self):
        self.status = True
        self.msg = None
        self.data = None

    @property
    def dict(self):
        return self.__dict__


response = Response()




class Disk(object):
    def __init__(self):
        self.response = response

    @property
    def info(self):
        self.response.status = 100
        self.response.msg = '魏新雨咋软'
        self.response.data = {'1':{'capatablities': '100GB', 'model': 'hp2344'}}

        return self.response.dict



class Memory(object):
    def __init__(self):
        self.response = response

    @property
    def info(self):
        self.response.status = 100
        self.response.msg = '陈骏啊, 萨宁啊'
        self.response.data = {'#DISM1':{'capatablities': '8GB', 'model': 'kingstong222'}}
        return self.response.dict


disk = Disk().info
memory = Memory().info


print(disk)  # {'status': 100, 'msg': '陈骏啊, 萨宁啊', 'data': {'#DISM1': {'capatablities': '8GB', 'model': 'kingstong222'}}}
print(memory)  # {'status': 100, 'msg': '陈骏啊, 萨宁啊', 'data': {'#DISM1': {'capatablities': '8GB', 'model': 'kingstong222'}}}


最后2者的输出结果是一样的, 因为无论是Disk对象还是Memory对象, 他们的属性self.response 指向的都是response这个对象, 所以最后的值是由最后一次赋值的结果


TypeError: Object of type 'Response' is not JSON serializable


原因: 返回的对象无法用json进行实例化(json.dumps(ret)), 最后返回的是个对象, 而不是字典


lib.response.py

class Response(object):
    def __init__(self):
        self.status = None
        self.msg = None
        self.data = None

    @property
    def dict(self):
        return self.__dict__


src.plugins.disk.py

from .base import BasePlugin
import os
import traceback
from lib.response import Response



class Disk(BasePlugin):
    def __init__(self, handler):
        super().__init__(handler)
        self.disk_path = os.path.join(self.filepath, 'disk.out')
        # self.response = response_obj
        self.error = traceback.format_exc()
        self.response = Response()

    def Windows(self):
        return 'windows'

    def Linux(self, handler):
        # print('disk', response)
        if not self.debug:
            data = handler.cmd('sudo MegaCli -PDList -aALL')
        else:
            try:
                data = open(self.disk_path, 'r', encoding='utf-8').read().split('Enclosure Device ID: 32')[1:]
                disk_dict = self.LinuxParse(data)

                self.response.status = 1000
                self.response.msg = '采集磁盘成功'
                self.response.data = disk_dict

            except Exception:
                self.response.status = 4000
                self.response.msg = self.error

        return  self.response


    def LinuxParse(self, data):
        key_map = {
            'PD Type': 'iface',
            'Slot Number': 'slot',
            'Inquiry Data': 'model',
            'Raw Size': 'capacity',
        }
        disk_dict = {}
        for item in data:
            res = item.strip().split('\n')
            info = {}
            for row in res:
                if len(row.strip().split(':')) == 2:
                    key, value = row.strip().split(':')
                    if key in key_map:
                        info[key_map[key]] = value.strip()

            disk_dict[info['slot']] = info

            return disk_dict


API


TypeError: init() missing 1 required positional argument: 'app_module'



原因: 将app注册到MIDDLEWARE的列表中


猜你喜欢

转载自www.cnblogs.com/cjwnb/p/11846359.html