美文网首页python自动化运维Python自动化运维运维开发
打怪升级-运维平台RESTful第一天(新手村出生篇)

打怪升级-运维平台RESTful第一天(新手村出生篇)

作者: 大Q的梦想 | 来源:发表于2021-04-01 17:15 被阅读0次

    序言:随着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竟然一篇中文攻略都没有。。。。。。看来,是时候下班了,早点睡觉,明日再战。

    相关文章

      网友评论

        本文标题:打怪升级-运维平台RESTful第一天(新手村出生篇)

        本文链接:https://www.haomeiwen.com/subject/jbmtkltx.html