打怪升級-運維平臺RESTful第一天(新手村出生篇)

序言:隨著Ajax的流行,API返回數(shù)據(jù),而不是HTML頁面,數(shù)據(jù)交互量減少,用戶體驗會更好。前后臺分離,后臺更多地進行數(shù)據(jù)處理,前臺對數(shù)據(jù)進行渲染,嗶嗶嗶嗶(各種華麗的功能)........運維平臺寫到現(xiàn)在也已經(jīng)到了v6版本,除了一些日常需求外,沒有太大的架構(gòu)迭代更新。作為一個運維工具人,我的夢想就是下崗后在家接活開發(fā)網(wǎng)站,而不是奔波在外給人家扛服務(wù)器。所以時代的腳步必須跟上,RESTful必須安排上。后續(xù)通過日記的方式記錄下一個運維工具人通過重構(gòu)平臺RESTful API,被各式各樣的Python怪物、Css怪物、Js怪物上一課的經(jīng)歷。

一、Django Rest Framework的一句話攻略

Django REST framework是一個建立在Django基礎(chǔ)之上的Web 應(yīng)用開發(fā)框架,可以快速的開發(fā)REST API接口應(yīng)用。在REST framework中,提供了序列化器serializers的定義,可以幫助我們簡化序列化與反序列化的過程,不僅如此,還提供豐富的類視圖、擴展類、視圖集來簡化視圖的編寫工作。REST framework還提供了認證、權(quán)限、限流、過濾、分頁、接口文檔等功能支持。REST framework提供了一個API 的Web可視化界面來方便查看測試接口。
一直想認真的總結(jié)一下,一直也不會總結(jié),所以沒什么總結(jié)比盜用一張框圖更簡單了。下面這兩張圖分別是Django的框圖和Django REST Framwork的框圖:


image.png

二、怪物一號(Django Rest Framework)

按照網(wǎng)上的攻略,下載安裝django framework,新手村出的很順利。隨即也迎來了一個怪物一號(Django Rest Framework),按照攻略創(chuàng)建序列化器、創(chuàng)建視圖(將以前的代碼復(fù)制粘貼到對應(yīng)的POST、DELETE、PUT、GET方法下)、注冊路由、POSTMAN測試,輕松戰(zhàn)勝。

models.py資產(chǎn)管理的表;基本沿用之前的,無特殊改動。

class Cmdb(models.Model): 
    class Meta: 
        verbose_name = '資產(chǎn)設(shè)備匯總'
        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('設(shè)備名稱', max_length=30) 
    unit_title = models.CharField('設(shè)備別名', max_length=30,default='xx.youth.cn/xx.k618.cn', blank=True) 
    unit_ip = models.CharField('設(shè)備IP地址', blank=True, max_length=50)
    unit_vip = models.CharField('設(shè)備虛擬IP地址', blank=True, max_length=50)
    unit_ipmi = models.CharField('設(shè)備遠程管理IP地址', blank=True, max_length=50)
    unit_outside_ip = models.CharField('設(shè)備公網(wǎng)IP地址', blank=True, max_length=50)
    unit_user = models.ForeignKey(SaUsers, verbose_name="設(shè)備使用者", on_delete=models.PROTECT)
    unit_user_departments = models.ForeignKey(Departments,verbose_name="設(shè)備使用部門", on_delete=models.PROTECT)
    unit_importance = models.ForeignKey(Importance,verbose_name="設(shè)備重要程度", default=1, on_delete=models.PROTECT)
    unit_status = models.ForeignKey(Status,verbose_name='設(shè)備使用狀態(tài)', on_delete=models.PROTECT)
    unit_buy_year = models.ForeignKey(Year,verbose_name='設(shè)備購買年份', on_delete=models.PROTECT)
    unit_buy_in_projects = models.ForeignKey(Project_manage,verbose_name= '設(shè)備購買項目')
    unit_url = models.URLField('設(shè)備URL地址', blank=True) 
    unit_type = models.ForeignKey(Type,verbose_name='設(shè)備類型', on_delete=models.PROTECT)
    unit_use_type = models.CharField(verbose_name = '設(shè)備使用類別', max_length=50, blank=True, null=True)
    unit_model = models.CharField('設(shè)備型號', max_length=50, blank=True)
    unit_frame_place = models.CharField('設(shè)備機架位置',default='@C-01-01', max_length=20, blank=True)
    unit_place = models.ForeignKey(Place, verbose_name='設(shè)備地理位置', on_delete=models.PROTECT)
    unit_system = models.CharField('設(shè)備硬件信息', max_length=50, blank=True)
    unit_body = models.CharField('設(shè)備U數(shù)', max_length=50, blank=True)
    unit_assets_tag = models.CharField('設(shè)備資產(chǎn)編號', max_length=100, blank=True)
    unit_assets_sn = models.CharField('設(shè)備資產(chǎn)編號', max_length=100, blank=True)
    unit_intro = models.TextField ('設(shè)備備注', 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('內(nèi)核', max_length=50, blank=True, null=True)           
    unit_kernelrelease = models.CharField('內(nèi)核版本', max_length=50, blank=True, null=True) 
    unit_os = models.CharField('操作系統(tǒng)', max_length=50, blank=True, null=True)
    unit_osrelease = models.CharField('操作系統(tǒng)版本', max_length=50, blank=True, null=True)     
    unit_num_cpus = models.CharField('CPU數(shù)量', max_length=50, blank=True, null=True)            
    unit_osarch = models.CharField('架構(gòu)', 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('設(shè)備價格',  blank=True)
    unit_expire = models.DateTimeField('設(shè)備過保時間', 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:
        """"制定元數(shù)據(jù)的model和fields"""
        model = Cmdb
        fields = '__all__'

cmdb_viws.py文件中編寫視圖;每個模型對應(yīng)一個視圖,繼承DRF的viewsets.ModelViewSet類,包含POST、DELETE、PUT、GET四大法王,通過不同的請求方法映射到DRF定義的對應(yīng)的動作方法上。通俗點就是把以前的增刪改查幾個方法,合并到一個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):
 "查"

現(xiàn)在的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來做數(shù)據(jù)請求。前端0經(jīng)驗值的運維工具人,看著Jquery、Css怪物都發(fā)慌,但還是準備裝備datatables.js硬杠怪物。網(wǎng)上找了半天攻略,DRF+datatables竟然一篇中文攻略都沒有。。。。。??磥?,是時候下班了,早點睡覺,明日再戰(zhàn)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容