序言:隨著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的框圖:

二、怪物一號(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)被我輕松打敗,膨脹的我迎來了怪物二號(頁面渲染)。毫無懸念的被怪物二號教做人。
以前的請求流程是這樣的(盜圖):

RESTful后是請求流程是這樣的(盜圖):

因為請求變成了異步,要靠Ajax來做數(shù)據(jù)請求。前端0經(jīng)驗值的運維工具人,看著Jquery、Css怪物都發(fā)慌,但還是準備裝備datatables.js硬杠怪物。網(wǎng)上找了半天攻略,DRF+datatables竟然一篇中文攻略都沒有。。。。。??磥?,是時候下班了,早點睡覺,明日再戰(zhàn)。