07 构建 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.py 的 INSTALLED_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 还为我们提供了许多高级功能,我们将在后续小节为大家详细介绍。