使用Django开发REST接口

  • 1、创建视图
  • 2、注册路由
  • 3、测试
  • 4、DRF开发REST接⼝步骤
  • 5、DRF 特点


我们以在Django框架中使⽤的频道- 类别案例来写⼀套⽀持类别数据增删改查的REST API接⼝,来理解REST API的开发。
前后端传值都是JSON格式数据。

1、创建视图

import json

from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.views.generic.base import View

# Create your views here.
from app1.models import NewsChannel


class ChannelsAPIView(View):
    def get(self, request):
        '''
        GET  /channels/
        查询所有的频道信息
        :param request:
        :return:
        '''
        channel_queryset = NewsChannel.objects.all()

        channel_list = []

        for channel in channel_queryset:
            channel_list.append({
                'id': channel.id,
                'name': channel.name,
                'url': channel.url
            })

        return JsonResponse(channel_list,safe=False)

    def post(self,request):
        '''
        POST /channels/
        新增频道信息
        :param request:
        :return:
        '''
        #接收前端传递过来的参数
        params=request.body
        #校验参数
        if not params:
            return JsonResponse({'errormsg':'请求参数有误'})

        #将bytes类型转换为json格式的数据
        params_str=params.decode()
        #将str转换成dict歌颂数据
        params_dict=json.loads(params_str)

        #入库操作
        channel=NewsChannel.objects.create(name=params_dict.get('name'),
                                   url=params_dict.get('url'))
        #响应结果
        return JsonResponse({
                'id': channel.id,
                'name': channel.name,
                'url': channel.url
            },status=201)

class ChannelAPIView(View):
    def get(self,request,pk):
        '''
        GET  /channels/pk/
        #查询频道详细信息
        :param request:
        :param pk:
        :return:
        '''
        try:
            channel=NewsChannel.objects.get(pk=pk)
        except NewsChannel.DoesNotExist:
            return HttpResponse(status=404)

        return JsonResponse({
                'id': channel.id,
                'name': channel.name,
                'url': channel.url
            },status=201)

    def put(self,request,pk):
        '''
        PUT  /channels/pk/
        修改某条数据
        :param request:
        :return:
        '''
        try:
            channel=NewsChannel.objects.get(pk=pk)
        except NewsChannel.DoesNotExist:
            return HttpResponse(status=404)

        params = request.body
        if not params:
            return JsonResponse({'errormsg':'缺少必传参数'})

        params_str=params.decode()
        params_dict=json.loads(params_str)
        channel.name=params_dict.get('name','')
        channel.url=params_dict.get('url','')
        channel.save()

        return JsonResponse({
            'id': channel.id,
            'name': channel.name,
            'url': channel.url
        }, status=201)
    
    def delete(self,request,pk):
        '''
        DELETE /channels/pk/
        删除某条频道数据
        :param request: 
        :return: 
        '''
        try:
            channel=NewsChannel.objects.get(pk=pk)
        except NewsChannel.DoesNotExist:
            return HttpResponse(status=404)
        
        channel.delete()
        
        return HttpResponse(status=204)

2、注册路由

根路由

from django.contrib import admin
from django.urls import path,re_path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^',include('app1.urls'))
]

子路由

from django.urls import path,re_path
from . import views

urlpatterns=[
    re_path('^channels/$',views.ChannelsAPIView.as_view()),
    re_path('^channels/(?P<pk>\d+)/$',views.ChannelAPIView.as_view())
]

3、测试

查询列表数据

django 二次开发openstack_REST

增加数据

django 二次开发openstack_restful_02

查询单条数据

django 二次开发openstack_数据_03

修改数据

django 二次开发openstack_python_04

删除数据

django 二次开发openstack_REST_05

4、DRF开发REST接⼝步骤

在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复⽤简化编写的:

增:校验请求数据 -> 执⾏反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
删:判断要删除的数据是否存在 -> 执⾏数据库删除
改:判断要修改的数据是否存在 -> 校验请求的数据 -> 执⾏反序列化过程 ->保存数据库 -> 将保存的对象序列化并返回
查:查询数据库 -> 将数据序列化并返回

反序列化:将json格式的数据转化成模型类对象数据

序列化:将模型类对象数据转化成json格式的数据

5、DRF 特点

提供了定义序列化器Serializer的⽅法,可以快速根据 Django ORM 或者其它库⾃动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到⾃动⽣成 API,满⾜各种需要;
多种身份认证和权限认证⽅式的⽀持;
内置了限流系统;
直观的 API web 界⾯;
可扩展性,插件丰富