系列文章
使用django rest framework 包装你的API
前言
本文不会对restful等api概念进行长篇大论,旨在让大家快速上手api的开发,随着项目的增多,领导们意识到,让后端人员写前端代码是及其低效的事,于是特意给配了前端开发人员。前后端分离这种方式让我们专注于api的开发,不用考虑模板层,但写api也是有一定技巧的,我会循序渐进的从简到繁,再从繁到简的介绍django 开发api的方法。
让我们开始吧……
Django原生API入门
让我们先看一段代码……
以下写法有很多弊端:
1、数据库字段一个一个的序列化,不方便,工作量大,容易出错
2、如果有add_time这种时间字段,序列化的时候还会报错
3、使用HttpResponse传递json串比较麻烦。
注:建议大家使用谷歌浏览器调试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,优化以上代码……
# -*- 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,优化上面的代码……
# -*- 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,优化上面的代码……
# -*- 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] #取出数据
json_data = serializers.serialize("json", machines) #序列化
json_data = json.loads(json_data)# 加载成字典
return JsonResponse(json_data, safe=False) #扔出去
上面只是简单的介绍了原生API,其实有很多问题没有解决,比如动态文档问题,添加文件路径等问题,接下来我将会重点介绍drf的使用,来一一攻破它们。
