系列文章
使用django rest framework 包裝你的API
前言
本文不會對restful等api概念進行長篇大論步淹,旨在讓大家快速上手api的開發(fā),隨著項目的增多诚撵,領導們意識到缭裆,讓后端人員寫前端代碼是及其低效的事,于是特意給配了前端開發(fā)人員寿烟。前后端分離這種方式讓我們專注于api的開發(fā)澈驼,不用考慮模板層,但寫api也是有一定技巧的筛武,我會循序漸進的從簡到繁缝其,再從繁到簡的介紹django 開發(fā)api的方法。
讓我們開始吧……
Django原生API入門
讓我們先看一段代碼……
以下寫法有很多弊端:
1徘六、數(shù)據(jù)庫字段一個一個的序列化氏淑,不方便,工作量大硕噩,容易出錯
2假残、如果有add_time這種時間字段,序列化的時候還會報錯
3炉擅、使用HttpResponse傳遞json串比較麻煩辉懒。
注:建議大家使用谷歌瀏覽器調(diào)試json代碼,并在谷歌商店安裝JSONView
# -*- coding: utf-8 -*-
__date__ = '2018/2/5 下午10:36'
from django.views.generic.base import View
from django.http import HttpResponse
from machines.models import Machines
import json
class MachinesView(View):
def get(self, request):
json_list = []
machines = Machines.objects.all()[:100]
for machine in machines:
json_dict = {}
json_dict["username"] = machine.name
json_dict["password"] = machine.password
json_dict["port"] = machine.port
.........
json_list.append(json_dict)
return HttpResponse(json.dumps(json_list), content_type="application/json")
讓我們解決弊端問題1谍失,優(yōu)化以上代碼……
# -*- coding: utf-8 -*-
__date__ = '2018/2/5 下午10:36'
from django.views.generic.base import View
from django.http import HttpResponse
from machines.models import Machines
import json
from django.forms.models import model_to_dict #<<<<<<<<<<<<重點看我
class MachinesView(View):
def get(self, request):
json_list = []
machines = Machines.objects.all()[:100]
for machine in machines:
json_dict = model_to_dict(machine) #<<<<<<<<<<<<<<重點看我
json_list.append(json_dict) #<<<<<<<<<<<<<<重點看我
return HttpResponse(json.dumps(json_list), content_type="application/json")
接下來解決弊端問題2眶俩,優(yōu)化上面的代碼……
# -*- coding: utf-8 -*-
__date__ = '2018/2/5 下午10:36'
from django.views.generic.base import View
from django.http import HttpResponse
from machines.models import Machines
import json
from django.core import serializers #<<<<<<<<<<<<<<重點看我和下面的類
class MachinesView(View):
def get(self, request):
machines = Machines.objects.all()[:100]
json_data = serializers.serialize("json", machines)
json_data = json.loads(json_data)
return HttpResponse(json.dumps(json_data), content_type="application/json") #這里必須把json_data序列化,才能傳入HttpResponse,json.dumps之后是字符串快鱼,而json.loads后是字典
為了說明json.dumps和json.loads颠印,我臨時改進了上面代碼中的類纲岭,去掉冗余的一步json_data = serializers.serialize("json", machines),然后直接傳json_data給HttpResponse,你也可以不看這一步线罕,直接看解決弊端3的代碼部分
class MachinesView(View):
def get(self, request):
machines = Machines.objects.all()[:100]
json_data = serializers.serialize("json", machines)
return HttpResponse(json_data, content_type="application/json")
再解決弊端問題3止潮,優(yōu)化上面的代碼……
# -*- coding: utf-8 -*-
__date__ = '2018/2/5 下午10:36'
from django.views.generic.base import View
from django.http import JsonResponse #<<<<<<<<<<<重點看我
from machines.models import Machines
import json
from django.core import serializers
class MachinesView(View):
def get(self, request):
machines = Machines.objects.all()[:100] #取出數(shù)據(jù)
json_data = serializers.serialize("json", machines) #序列化
json_data = json.loads(json_data)# 加載成字典
return JsonResponse(json_data, safe=False) #扔出去
上面只是簡單的介紹了原生API,其實有很多問題沒有解決钞楼,比如動態(tài)文檔問題喇闸,添加文件路徑等問題,接下來我將會重點介紹drf的使用询件,來一一攻破它們燃乍。