笔记

 

使用os.environ传递数据

# -*- coding:utf-8 -*-
import os

username = input("username>>")
password = input("password>>")

os.environ.setdefault("u",username)
os.environ.setdefault("p",password)


if __name__ == '__main__':
    from haha import run

    run()
main.py
# -*- coding:utf-8 -*-
import os

def run():
    u = os.environ.get("u")
    p = os.environ.get("p")

    print("{}_{}".format(u,p))
haha.py

 

 

settings,融合global_settings和用户settings

"""
    内置配置文件
"""

NAME1 = "global_settings"
NAME2 = "global_settings_2"
global_settings.py
# -*- coding:utf-8 -*-
"""
    自定义配置文件
"""
import os
BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


MODE = "AGENT"  # SALT,SSH,AGENT
SSH_USER = "root"
SSH_PWD = "root"
SSH_KEY = "/xxx/xxx/xx"
SSH_PORT = 22

DEBUG = True

PLUGINS_DICT = {
    "basic":"src.plugins.basic.Basic",
    "board":"src.plugins.board.Board",
    "cpu":"src.plugins.cpu.Cpu",
    "disk":"src.plugins.disk.Disk",
    "memory":"src.plugins.memory.Memory",
    "nic":"src.plugins.nic.Nic",
}


API = "http://1.1.1.1:8000/api/asset.html"

CERT_PATH = os.path.join(BASEDIR,"config","cert")
settings.py(自定义settings)
from . import global_settings  # 导入global_settings
import os
import importlib


class Settings(object):
    def __init__(self):
        # ############## 找到默认配置global_settings ##############
        for name in dir(global_settings):  # 遍历global_settings的变量
            if name.isupper():  # 如果变量为大写,则是settings里定义的变量。global_settings的变量名约定俗成为大写。
                value = getattr(global_settings,name)
                setattr(self,name,value)  # 把key:name,value:value的赋给Settings


        # ############## 找到自定义配置,比默认配置优先级高,因此放在下面,下面的会覆盖上面的 ##############
        # 根据字符串导入模块
        settings_module = os.environ.get("USER_SETTINGS")  # 在start.py已把用户自定义settings导入到environ变量,现结合importlib导入模块
        if not settings_module:
            return
        m = importlib.import_module((settings_module))
        for name in dir(m):  # 与上面的gloabl_settings类似
            if name.isupper():
                value = getattr(m,name)
                setattr(self,name,value)


settings = Settings()  # 实例化
融合2个settings
# -*- coding:utf-8 -*-
import os
import sys
os.environ["USER_SETTINGS"] = "config.settings"
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)



from src import script


if __name__ == '__main__':

    script.run()
程序入口处把用户settings增加os.environ

更详细的,可查看django的settings,from django.conf import settings

 

插件式代码

类似django的中间件

PLUGINS_DICT = {
    "basic":"src.plugins.basic.Basic",
    "board":"src.plugins.board.Board",
    "cpu":"src.plugins.cpu.Cpu",
    "disk":"src.plugins.disk.Disk",
    "memory":"src.plugins.memory.Memory",
    "nic":"src.plugins.nic.Nic",
}
settings.py
# 放在 src/plugins/__init__.py
import importlib
import traceback
from lib.conf.config import settings


class PluginManager(object):
    def exec_plugin(self):
        """
        获取所有的插件,并执行获取插件返回值
        :return:
        """
        response = {}
        for k,v in self.plugin_dict.items():
            #  'basic': "src.plugins.basic.Basic",
            ret = {'status':True,'data':None}
            try:
                module_path, class_name = v.rsplit('.', 1)
                m = importlib.import_module(module_path)
                cls = getattr(m,class_name)  # 这里是根据settings里的PLUGINS_DICT进行逐个导入
                if hasattr(cls,'initial'):
                    obj = cls.initial()  # 自定义一个钩子
                else:
                    obj = cls()
实现代码

 

from importlib import import_module
def load_object(path):
    """Load an object given its absolute object path, and return it.

    object can be a class, function, variable or an instance.
    path ie: 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware'
    """

    try:
        dot = path.rindex('.')
    except ValueError:
        raise ValueError("Error loading object '%s': not a full path" % path)

    module, name = path[:dot], path[dot+1:]
    # module, _, name = path.rpartition(".")
    # if not all([module,name]):raise ValueError("Error loading object '%s': not a full path" % path)
    mod = import_module(module)


    try:
        obj = getattr(mod, name)
    except AttributeError:
        raise NameError("Module '%s' doesn't define any object named '%s'" % (module, name))

    return obj
补充

 

类属性转换为实例属性

 1 class Form(object):
 2     def __init__(self, handler=None):
 3         """
 4 
 5         :param handler: Tornado请求中的XXXHandler对象
 6         :return:
 7         """
 8         self.handler = handler
 9         self.FiledDict = {}
10         self.value_dict = {}
11         self.error_dict = {}
12         self.valid_status = True
13 
14         self.initialize()
15 
16     def initialize(self):
17         """
18         初始化,将派生类Form中的静态字段拷贝到字段FiledDict中,并为字段对应的Html插件设置id和name属性
19         :return:
20         """
21         for k, v in self.__class__.__dict__.items():
22             if isinstance(v, Field):
23                 field = copy.deepcopy(v)
24                 field.name = k
25                 field.widget.attr['name'] = k
26                 """
27                 if 'id' not in field.widget.attr:
28                     field.widget.attr['id'] = '%s_%s' % ('id', k)
29                 """
30                 self.FiledDict[k] = field
31         self.__dict__.update(self.FiledDict)
tyrion例子:类属性转换为实例属性

 

posted @ 2018-11-20 22:18  fat39  阅读(134)  评论(0)    收藏  举报