服务端相关 / 07 构建 RESTful Web API

利用 Django REST framework 构建 RESTful Web API

终于到了动手操作的环节啦,这一节,我们以师生管理系统为例,带领大家搭建一套 framework Web API。“工欲善其事,必先利其器”,我们选用当下最为流行的 Django REST framework 为工具,快速实现这套API。

安装 Django REST framework 需要以下依赖:

  • Python (3.5, 3.6, 3.7, 3.8)
  • Django (1.11, 2.0, 2.1, 2.2, 3.0)

Django REST framework是以 Django 扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需重新创建。(若没有Django环境,需要先创建环境安装Django)

1. 安装 Django REST framework

pip install django 
pip install djangorestframework

django 安装过程:

图片描述

django-rest-framework 安装过程:

图片描述

2.创建工程和应用

django-admin startproject ProjectDemo
django-admin startapp AppDemo

工程和应用创建完成后,目录结构如下图所示:

图片描述

3. 注册rest_framework应用

Django REST framework 可视作是 Django 的一个应用,在使用之前,需要在 settings.pyINSTALLED_APPS 中注册。

# settings.py

INSTALLED_APPS = [
    ...
    'rest_framework',
]

在完成以上操作后,就可以使用 Django REST framework 开发 Restful Web API 了。接下来,我们将以学生管理系统为例,带大家一览 Django REST framework 如何高效开发 REST API。

4.创建、迁移模型,并添加数据

构建数据模型,是搭建 Restful Web API 的基础。构建模型,相当于构建数据库结构,且无需繁琐的 SQL 语言,另一个好处是,即使切换不同的数据库引擎(mysql 、SQL Server、Oracle等),也无需重新构建。下方我们构建一个学生信息表,包含学生姓名、学生年龄和学号。

# models.py

from django.db import models

class StudentsInfo(models.Model):
		'''
		学生信息模型
		'''
    # 以下为学生信息表中的各个字段,CharField、IntegerField声明了字段类型分别为字符串类型和整型,max_length规定了字段最大长度,verbose_name相当于给字段取了一个别名,将来在管理页面会显示这个别名,否则显示字段名。例如,如果设置了verbose_name,那么在管理页面中,s_name字段将一“学生姓名”显示出来,如果没有设置verbose_name,则直接显示“s_name”。verbose_name只是方便用户以后的使用,设置与否不影响内部数据的存储。
    s_name = models.CharField(max_length=8, verbose_name='学生姓名')
    s_age = models.IntegerField(verbose_name='学生年龄')
    s_number = models.CharField(max_length=16, verbose_name='学号')

终端中运行命令以迁移模型

python manage.py makemigrations
python migrate

向数据库中添加演示数据,这里我们可以使用 PyCharm 自带的 Database 工具来完成。由于我们使用的是sqlite3 作为数据库,添加数据时,可双击左侧文件目录中的 db.sqlite3 文件,而后在右侧 Database 工具中双击要操作的数据表(AppDemo_studentsmodel)。

图片描述

在打开的数据表中,填入要填充的数据即可:

图片描述

5. 创建序列化器

通常,API 包含两个方向的操作,其一是客户端向服务器请求数据,其二是客户端向服务器提交数据。当客户端向服务器请求数据时,服务器在数据库检索相应数据,经过序列化器序列化,再由视图交给客户端;客户端向服务器提交数据时,数据经由视图层进行处理,而后序列化器反序列化,最后存入数据库。

图片描述

在 Restful Web API 中,序列化器相当于客户端和数据库之间数据对接的桥梁,它可将服务器中的数据,序列化为客户端可解析的数据形式,相反,也可将客户端提供的数据,反序列化为符合数据库要求的数据形式。接下来,我们在 AppDemo 应用中新建 serializers.py 用于保存该应用的序列化器。

创建一个 StudentsSerializer 用于序列化与反序列化学生信息:

# serializers.py

from rest_framework import serializers
from AppDemo.models import StudentsModel

class StudentsSerializer(serializers.ModelSerializer):

    class Meta:
        # 对StudentsModel进行序列化
        model = StudentsModel
        # __all__表示对 StudentsModel 中所有字段序列化进行序列化
        fields = '__all__'
  • model :指明该序列化器处理的数据字段从模型类 StudentsModel 参考生成;
  • fields :指明该序列化器包含模型类中的哪些字段,'all’指明包含所有字段。

5. 编写视图

在 Restful Web API 中,视图扮演的角色是数据处理器。例如,客户端需要获取一个学生一次期末考试后各科成绩的平均值,而数据库中仅存了各科的成绩,这时,就需要视图对数据处理,根据各科成绩求出平均值后返回给客户端。由于本案例无需对数据进行处理,视图实现较为简单。在 booktest 应用的 views.py 中创建视图 BookInfoViewSet,这是一个视图集合。

# views.py

from rest_framework import viewsets
from AppDemo.models import StudentsModel
from AppDemo.serializers import StudentsSerializer

class StudentsViewSet(viewsets.ModelViewSet):

    queryset = StudentsModel.objects.all()
    # 使用上一步创建的StudentsSerializer对模型进行序列化
    serializer_class = StudentsSerializer

  • queryset 指明该视图集在查询数据时使用的查询集;
  • serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器。

6. 定义路由

路由是用来定义 RESTful Web API 不同接口所对应的不同路径地址。在本案例中,我们是要获得学生的信息,根据第 3 节中介绍的设计规范,地址应设计为:http://www.demo.com/api/students 。在 ProjectDemo 的 urls.py 中定义路由信息。

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

from AppDemo.views import StudentsViewSet

router = routers.DefaultRouter() # 创建路由器
router.register(r'students', StudentsViewSet)	# 在路由器中注册视图集路由地址

urlpatterns = [
  	# 拼接路由路径
    path('api/', include(router.urls)),
]

8. 运行测试

终端中运行当前程序(与运行 Django 一样):

python manage.py runserver

此时,我们的 RESTful Web API 已构建完毕。由于我们是在本地测试,所以 API 域名部分采用本机地址。在浏览器地址栏输入 http://127.0.0.1:8000/api,即可看到当前项目中所有接口连接。

图片描述

点击链接 http://127.0.0.1:8000/api/students/ 即可前往学生信息接口,可以获取所有学生的信息,如下图所示:

图片描述

在页面底部的表单中,我们可以输入学生信息,点击 POST 按钮,即可实现向学生列表中添加新的学生信息:

图片描述

点击 POST 按钮后,返回如下信息:

图片描述

此时再点击 GET 按钮,我们发现上一步中添加的学生(小白)已经显示在所有学生信息中。

图片描述

在浏览器中输入网址 127.0.0.1:8000/api/students/2/,可以访问获取单个学生信息的接口(id 为 2 的学生),如下图所示:

图片描述

如果需要修改该学生的信息,可在页面底部表单中填写需要修改的信息,即可访问修改单个学生的接口。我们将小红年龄修改为 20:

图片描述

点击 PUT,返回如下页面信息,此时小红的年龄信息已经修改完毕:

图片描述

点击 DELETE 按钮,可以访问删除学生的接口

图片描述

点 DELETE 后返回,如下页面,此时 id 为 2 的学生小红已被删除:

图片描述

9.小结

本节主要讲解了 Django 和 Django REST framework 安装方法,并利用 Django REST framework 实现了一个简单的学生管理系统 RESTful Web API。至此,一个符合 RESTful 规范的简单 API 就创建完成了。除此之外,Django REST framework 还为我们提供了许多高级功能,我们将在后续小节为大家详细介绍。