• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

POPS工程2.0基础代码结构

一、工程结构

./
├── api  //存放tornardo接口相关
├── conf //相关服务应用配置
├── manage.py
├── modules //pops工程所用核心模块加载
├── pops  //项目目录
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── requirements.txt  //工程所需的python模块列表
└── tasks   //后台相关的所有应用
    ├── __init__.py
    └── scandevs   //自动化扫描应用
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-36.pyc
        │   ├── admin.cpython-36.pyc
        │   └── models.cpython-36.pyc
        ├── admin.py
        ├── apps.py
        ├── migrations   
        │   ├── 0001_initial.py
        │   ├── __init__.py
        ├── models.py
        ├── tests.py
        └── views.py

注意:

这种工程的代码结构下,导入django中应用工程的模块,

加入 tasks则找不到应用

from tasks.scandevs.models import *

方式如下:

In [1]: from scandevs.models import *

 

二、工程结构组织

1、settings.py加载对应的工程和模块

代码如下:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, 'tasks'))
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'scandevs',
]

2、mange.py让django通过--settings支持自定义配置文件加载

    if len(sys.argv) > 3:
        run_arg = sys.argv[2]
        if not run_arg.startswith('--settings'):
            os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pops.settings")
    else:
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pops.settings")

3、生成requrements.txt方式

/opt/python3.6/bin/pip freeze > requrements.txt

 

4、让工程支持pymysql模块

修改pops/__init__.py,内容如下:

import pymysql
pymysql.install_as_MySQLdb()

 

5、添加模版继承

编写完基类之后,在 Meta 内嵌类中设置 abstract=True ,该类就不能创建任何数据表。然而如果将它做为其他 model 的基类,那么该类的字段就会被添加到子类中。抽象基类和子类如果含有同名字段,就会导致错误(Django 将抛出异常)。

#---------------------设备登陆信息--------------------------

# 所有基础设备的父类模版
class ComDevInfo(models.Model):
    check_level = (
        (0,u'已确认'),
        (1,u'待确认'),
    )
    sn_key = models.CharField(max_length=256, verbose_name=u"唯一设备ID", default="")
    updated_at = models.DateTimeField(auto_now=True, verbose_name=u"更新时间")
    check_info = models.IntegerField(default=0,choices=check_level,verbose_name=u'是否经过确认')

    class Meta:
        abstract = True

 

#---------------------设备信息--------------------------
class PhysicalServerInfo(ComDevInfo):
    """物理服务器信息"""
    server_ip = models.CharField(max_length=40, verbose_name=u'服务器IP')
    machine_brand = models.CharField(max_length=60, default='--', verbose_name=u'服务器品牌')
    sys_ver = models.CharField(max_length=30, default='', verbose_name=u'操作系统版本', blank=True)
    sys_hostname = models.CharField(max_length=15, verbose_name=u'操作系统主机名')
    mac = models.CharField(max_length=512, default='', verbose_name=u'MAC地址', blank=True)
    sn = models.CharField(max_length=256, verbose_name=u'主机序列号', default='', blank=True)
    vir_type = models.CharField(max_length=2, verbose_name=u'宿主机类型', default='', blank=True)
    # 物理服务器关联的机柜
    ser_cabin = models.ForeignKey('CabinetInfo')
    #机房
    room_info = models.ForeignKey(MachineRoom,verbose_name='机房信息')
    remarks = models.TextField(default='', verbose_name=u'物理服务器备注', blank=True)

    class Meta:
        db_table = "physicalserverinfo"
        verbose_name = u'物理服务器信息表'
        verbose_name_plural = verbose_name
        ordering = ['-id']

    def __str__(self):
        return self.server_ip

 

POPS工程2.0基础代码结构

Pingbacks已打开。

引用地址

暂无评论

发表评论