序言:随着Ajax的流行,API返回数据,而不是HTML页面,数据交互量减少,用户体验会更好。前后台分离,后台更多地进行数据处理,前台对数据进行渲染,哔哔哔哔(各种华丽的功能)........运维平台写到现在也已经到了v6版本,除了一些日常需求外,没有太大的架构迭代更新。作为一个运维工具人,我的梦想就是下岗后在家接活开发网站,而不是奔波在外给人家扛服务器。所以时代的脚步必须跟上,RESTful必须安排上。后续通过日记的方式记录下一个运维工具人通过重构平台RESTful API,被各式各样的Python怪物、Css怪物、Js怪物上一课的经历。
一、Django Rest Framework的一句话攻略
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器serializers的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
一直想认真的总结一下,一直也不会总结,所以没什么总结比盗用一张框图更简单了。下面这两张图分别是Django的框图和Django REST Framwork的框图:
image.png
二、怪物一号(Django Rest Framework)
按照网上的攻略,下载安装django framework,新手村出的很顺利。随即也迎来了一个怪物一号(Django Rest Framework),按照攻略创建序列化器、创建视图(将以前的代码复制粘贴到对应的POST、DELETE、PUT、GET
方法下)、注册路由、POSTMAN测试,轻松战胜。
models.py
资产管理的表;基本沿用之前的,无特殊改动。
class Cmdb(models.Model):
class Meta:
verbose_name = '资产设备汇总'
verbose_name_plural = verbose_name
ordering = ['-unit_change_at']
unit_id = models.UUIDField(primary_key=True, auto_created=True, default=uuid.uuid4, editable=False)
unit_subtitle = models.CharField('设备名称', max_length=30)
unit_title = models.CharField('设备别名', max_length=30,default='xx.youth.cn/xx.k618.cn', blank=True)
unit_ip = models.CharField('设备IP地址', blank=True, max_length=50)
unit_vip = models.CharField('设备虚拟IP地址', blank=True, max_length=50)
unit_ipmi = models.CharField('设备远程管理IP地址', blank=True, max_length=50)
unit_outside_ip = models.CharField('设备公网IP地址', blank=True, max_length=50)
unit_user = models.ForeignKey(SaUsers, verbose_name="设备使用者", on_delete=models.PROTECT)
unit_user_departments = models.ForeignKey(Departments,verbose_name="设备使用部门", on_delete=models.PROTECT)
unit_importance = models.ForeignKey(Importance,verbose_name="设备重要程度", default=1, on_delete=models.PROTECT)
unit_status = models.ForeignKey(Status,verbose_name='设备使用状态', on_delete=models.PROTECT)
unit_buy_year = models.ForeignKey(Year,verbose_name='设备购买年份', on_delete=models.PROTECT)
unit_buy_in_projects = models.ForeignKey(Project_manage,verbose_name= '设备购买项目')
unit_url = models.URLField('设备URL地址', blank=True)
unit_type = models.ForeignKey(Type,verbose_name='设备类型', on_delete=models.PROTECT)
unit_use_type = models.CharField(verbose_name = '设备使用类别', max_length=50, blank=True, null=True)
unit_model = models.CharField('设备型号', max_length=50, blank=True)
unit_frame_place = models.CharField('设备机架位置',default='@C-01-01', max_length=20, blank=True)
unit_place = models.ForeignKey(Place, verbose_name='设备地理位置', on_delete=models.PROTECT)
unit_system = models.CharField('设备硬件信息', max_length=50, blank=True)
unit_body = models.CharField('设备U数', max_length=50, blank=True)
unit_assets_tag = models.CharField('设备资产编号', max_length=100, blank=True)
unit_assets_sn = models.CharField('设备资产编号', max_length=100, blank=True)
unit_intro = models.TextField ('设备备注', blank=True, max_length=2000)
unit_cpu_model = models.CharField('CPU类型', max_length=50, blank=True, null=True)
unit_wwn = models.CharField('WWN号', max_length=150, blank=True, null=True)
unit_hwaddr_interfaces = models.CharField('MAC地址', max_length=30, blank=True, null=True)
unit_kernel = models.CharField('内核', max_length=50, blank=True, null=True)
unit_kernelrelease = models.CharField('内核版本', max_length=50, blank=True, null=True)
unit_os = models.CharField('操作系统', max_length=50, blank=True, null=True)
unit_osrelease = models.CharField('操作系统版本', max_length=50, blank=True, null=True)
unit_num_cpus = models.CharField('CPU数量', max_length=50, blank=True, null=True)
unit_osarch = models.CharField('架构', max_length=80, blank=True, null=True)
unit_sync_zabbix = models.CharField('zabbix同步', max_length=5, blank=True, default="0")
unit_sync_soc = models.CharField('堡垒机同步', max_length=5, blank=True, default="0")
unit_sync_las = models.CharField('日志同步', max_length=5, blank=True, default="0")
unit_price = models.PositiveIntegerField('设备价格', blank=True)
unit_expire = models.DateTimeField('设备过保时间', auto_now=True)
unit_change_at = models.DateTimeField('最后更改时间', auto_now=True)
def as_dict(self):
try:
unit_buy_year_row = Year.objects.get(id=self.unit_buy_year_id).year_name
unit_buy_in_projects_row = Project_manage.objects.get(id=self.unit_buy_in_projects_id).project_manage_name
except:
unit_buy_year_row = ''
unit_buy_in_projects_row = ''
return {
"unit_id": self.unit_id,
"unit_subtitle": self.unit_subtitle,
"unit_ip": self.unit_ip,
"unit_assets_tag": self.unit_assets_tag,
"unit_status": self.unit_status_id,
"unit_assets_sn": self.unit_assets_sn,
"unit_frame_place": self.unit_frame_place,
"unit_buy_year": unit_buy_year_row,
"unit_model": self.unit_model,
"unit_body": self.unit_body,
"unit_buy_in_projects": unit_buy_in_projects_row,
"unit_place": self.unit_place_id,
}
cmdb_serializers.py
建立了第一个序列化器;序列化器有两个主要功能:序列化和反序列化。不明白的自行百度吧。代码如下:
class CmdbSerializer(serializers.ModelSerializer):
unit_place_name = serializers.CharField(source='unit_place.place_name')
unit_status_name = serializers.CharField(source='unit_status.status_name')
unit_buy_in_projects_name = serializers.CharField(source='unit_buy_in_projects.project_manage_name')
unit_user_departments_name = serializers.CharField(source='unit_user_departments.departments_name')
unit_user_name = serializers.CharField(source='unit_user.user_name')
unit_buy_year_name = serializers.CharField(source='unit_buy_year.year_name')
unit_type_name = serializers.CharField(source='unit_type.type_name')
class Meta:
""""制定元数据的model和fields"""
model = Cmdb
fields = '__all__'
cmdb_viws.py
文件中编写视图;每个模型对应一个视图,继承DRF的viewsets.ModelViewSet
类,包含POST、DELETE、PUT、GET
四大法王,通过不同的请求方法映射到DRF定义的对应的动作方法上。通俗点就是把以前的增删改查几个方法,合并到一个Cmdb_Assets_View
类下,代码如下:
以前的views.py
(详情省略):
def cmdb_assets_del(request):
"删"
pk = request.POST['pk']
Cmdb.objects.filter(pk =pk ).delete()
def cmdb_assets_edit(request):
"改"
def cmdb_assets_create(request):
"增"
def cmdb_assets_search(request):
"查"
现在的views.py
(详情省略):
class Cmdb_Assets_View(APIView):
def get(self, request, format=None):
"查 基本沿用以前的cmdb_assets_search",将request.GET['xxx'] 全部改成了request.query_params.get('xxx')"
cmdb=Cmdb.objects.all()
"对Queryset序列化"
serializer = CmdbSerializer(cmdb,many=True)
return Response(serializer.data)
def put(self, request, format=None):
"改 基本沿用以前的cmdb_assets_edit"
def delete(self, request, format=None):
"删 基本沿用以前的cmdb_assets_del,将 request.POST['xxx']改成了request.data['xxx']"
def post(self, request, format=None):
"增 基本沿用以前的cmdb_assets_create,将 request.POST['xxx']改成了request.data['xxx']""
二、怪物二号(页面渲染)
怪物一号(Django Rest Framework)被我轻松打败,膨胀的我迎来了怪物二号(页面渲染)。毫无悬念的被怪物二号教做人。
以前的请求流程是这样的(盗图):
image.png
RESTful后是请求流程是这样的(盗图):
image.png
因为请求变成了异步,要靠Ajax来做数据请求。前端0经验值的运维工具人,看着Jquery、Css怪物都发慌,但还是准备装备datatables.js硬杠怪物。网上找了半天攻略,DRF+datatables竟然一篇中文攻略都没有。。。。。。看来,是时候下班了,早点睡觉,明日再战。
网友评论