django 原生API入坑指南

系列文章

使用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的使用,来一一攻破它们。

你可能感兴趣的:(django 原生API入坑指南)