DRF框架之使用Django框架完成后端接口(API)的定义

Posted 老王同鞋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF框架之使用Django框架完成后端接口(API)的定义相关的知识,希望对你有一定的参考价值。

学习DRF框架,首先我们就需要明白为什么要学习这个框架。

接下来我们就先用原生的Django框架来定义一个符合RESTful设计方法的接口(API)。

RESTful接口的需求如下:

GET     /books/         查询所有图书信息
POST    /books/         新增图书信息
GET     /books/<pk>/    查询指定id的图书信息
PUT     /books/<pk>/    修改指定id的图书信息
DELETE  /books/<pk>/    删除指定id的图书信息
响应数据    JSON

1. 定义查询所有图书信息的接口:

class BooksInfoView(View):
    ‘‘‘查询所有图书信息,新增图书信息‘‘‘
    def get(self, request):
        ‘‘‘
        查询所有图书信息
        :return:JSON
        ‘‘‘

        # 查询所有图书模型:查询集
        book_model_list = BookInfo.objects.all()

        # 构造JSON数据
        book_list = []
        for book in book_model_list:
            book_dict = {
                id: book.id,
                btitle: book.btitle,
                bpub_date: book.bpub_date,
                bread: book.bread,
                bcomment: book.bcomment,
            }
            book_list.append(book_dict)

        # 响应JSON
        # JsonResponse传递字典列表时,需要指定safe=False
        return http.JsonResponse(book_list, safe=False)

2. 定义添加图书信息的接口:

因为,添加图书信息的路由和查询图书信息的路由一致,所以可以代码复用,直接在上一个视图中定义与请求方式同名的方法即可。

def post(self, request):
        ‘‘‘
        新增图书信息
        :return: JSON
        ‘‘‘
        # 获取前端传递的数据
        json_dict = json.loads(request.body.decode())

        # 省略校验步骤

        # 核心逻辑:将数据保存到数据库中
        book = BookInfo.objects.create(
            btitle = json_dict.get(btitle),
            bpub_date = json_dict.get(bpub_date),
            bread = json_dict.get(bread),
            bcomment = json_dict.get(bcomment)
        )

        # 构造响应数据
        book_dict = {
            id: book.id,
            btitle: book.btitle,
            bpub_date: book.bpub_date,
            bread: book.bread,
            bcomment: book.bcomment,
        }

        # 响应JSON
        # RESTful设计模式要求:增加后的数据需要返回给前端,并且响应status=201
        return http.JsonResponse(book_dict, status=201)

这里要注意,RESTful设计方法中要求添加和修改后的数据必须返回给前端,并且响应状态码为201.

3. 定义查询指定id的图书信息接口:

class BookInfoView(View):
    ‘‘‘查询、修改、删除指定id的图书信息‘‘‘

    def get(self, request, pk):
        ‘‘‘
        查询指定id的图书信息
        :param pk: 指定的图书id
        :return: JSON
        ‘‘‘
        try:
            # 查询图书信息
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return http.HttpResponseNotFound()

        # 构造JSON数据
        book_dict = {
            id: book.id,
            btitle: book.btitle,
            bpub_date: book.bpub_date,
            bread: book.bread,
            bcomment: book.bcomment,
        }

        # 响应JSON
        return http.JsonResponse(book_dict)

因为,修改、删除指定id的图书信息,路由地址与查询指定id的图书信息一致,所以可以进行接口定义代码的复用。

def put(self, request, pk):
        ‘‘‘
        修改指定id的图书信息
        :param pk: 指定的图书id
        :return: JSON
        ‘‘‘

        # 接受前端传递的数据
        json_dict = json.loads(request.body.decode())
        btitle = json_dict.get(btitle)
        bpub_date = json_dict.get(bpub_date)
        bread = json_dict.get(bread)
        bcomment = json_dict.get(bcomment)

        # 省略校验

        try:
            # 查询图书信息
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return http.HttpResponseNotFound()

        # 核心逻辑:将新值覆盖旧值
        book.btitle = btitle
        book.bpub_date = bpub_date
        book.bread = bread
        book.bcomment = bcomment
        book.save()

        # 构造JSON数据
        book_dict = {
            id: book.id,
            btitle: book.btitle,
            bpub_date: book.bpub_date,
            bread: book.bread,
            bcomment: book.bcomment
        }

        # 响应JSON
        # 在RESTful设计风格中,要求返回后端修改后的数据,并响应status=201
        return  http.JsonResponse(book_dict, status=201)

    def delete(self, request, pk):
        ‘‘‘
        删除指定id的图书信息
        :param pk: 指定的图书id
        :return: JSON
        ‘‘‘

        try:
            # 查询图书信息
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return http.HttpResponseNotFound()

        # 核心逻辑:删除数据
        book.delete()

        # 响应http:RESTful设计风格,要求删除数据响应http且status=204
        return http.HttpResponse(status=204)

到此,我们就完成了使用原生的Django框架结合RESTful设计方法定义的接口(API)。

我们,可以发现我们进行了多次序列化与反序列化(获取JOSN数据、构造JSON数据)的代码的编写,造成了大量的代码冗余,极大地降低了我们开发的效率。

然而,DRF框架(Django REST framework)序列化与反序列化的操作进行了高度的封装,使用DRF框架可以极大提升我们日常的工作效率。

工作效率高了,老板高兴了,给你发奖了,你也高兴了。

这也就是我们为什么要学习DRF框架的原因。

 

以上是关于DRF框架之使用Django框架完成后端接口(API)的定义的主要内容,如果未能解决你的问题,请参考以下文章

使用python的flask框架编写后端接口

067.Python框架Django之DRF视图类

Spring MVC 框架学习---- 后端接口小练习(计算器与登陆拦截)

使用vue-element-admin框架调用后端接口及跨域问题

Solon2 之 Groovy 语言开发后端接口项目

Node.js基于Express框架 + 连接MongoDB + 写后端接口