一、工程结构
./
├── 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