目录
00-前后端分离
01-RESTful-API
02-快速入门
03-序列化
04-序列化高级
05-序列化验证
06-请求和响应
07-类视图
08-认证和权限
09-使用jwt进行认证
10-限制频率
11-版本控制
12-分页
13-解析器
14-视图集和路由器
15-API文档
16-自定义异常
17-自定义返回响应
18-过滤
19-搜索
20-排序
2
4
6
9
13
25
29
32
34
38
45
46
48
50
52
54
55
56
61
66
67
开发模式 
在Web 开发模式中,有两种开发模式 
•  前后端不分离 
•  前后端分离 
 
 
前后端分离优势 
前后端分离缺点 
在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或
为什么要有前后端分离 
不再控制前端的效果。至于前端用户看到什么效果,从后端请求的数据如何加载到
在前后端不分离模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或
重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高。 
这种应用模式比较适合纯网页应用,但是当后端对接App 时,App 可能并不需要
后端返回一个HTML 网页,而仅仅是数据本身,所以后端原本返回网页的接口不
再适用于前端App 应用,为了对接App 后端还需再开发一套接口。 
在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染HTML 页面,
前端中,都由前端自己决定,网页有网页的处理方式,App 有App 的处理方式,
但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。 
在前后端分离的应用模式中 ,前端与后端的耦合度相对较低。 
者API,前端通过访问接口来对数据进行增删改查。 
•  多端适应 
•  前后端开发职责不清 
–  模板到低是前端写还是后端写?如果前端写,前端就要懂后端模板语言 
–  如果后端写,那么后端就要懂前段html,css,js 甚至更多更多 
•  开发效率问题,前后端相互等待 
–  前端在写的时候,就希望后端全部写好自己再写 
–  后端在写的时候,就希望前端全部写好自己再写 
•  前端一直配合着后端,能力受限(搞来搞去写静态页面,天天给后台写模板) 
•  后台开发语言和模板高度耦合,导致开发语言依赖(一旦用python 开发,以后要
换成java 或者其他语言) 
•  前后端学习门槛增加(比如后台很多模板语法控制前端展示,但是分离以后,需要
前端自己去实现,增加前端成本,对后台来说,后端要满足规范) 
•  数据依赖导致文档重要性增加 
–  文档是否详细 
–  是否及时更新 
–  修改要及时通知其他端 
•  前端工作量加大 
SEO 的难度增加(都是AJAX,像一些初级爬虫全部挡在外面,比如一些搜索引擎,
• 
这样你的排名就不靠前了) 
RESTful API 设计规范 
•  域名 
应该尽量将API 部署在专用域名之下 
https://api.example.com 
如果确定API 很简单,不会有进一步扩展,可以考虑放在主域名下。 
https://example.com/api/ 
•  版本 
应该将API 的版本号放入URL 
http://www.example.com/app/1.0/apples 
  
http://www.example.com/app/1.1/apples 
  
http://www.example.com/app/2.0/apples 
•  路径 
对于一个简洁结构,你应该始终用名词。 此外,利用的HTTP 方法可以分离网址
中的资源名称的操作。 
GET /products :将返回所有产品清单 
POST /products :将产品新建到集合 
GET /products/4 :将获取产品 4 
PATCH /products/4 将更新产品 4(部分属性更新) 
PUT  /products/4:将更新产品 4 (全部属性更新) 
•  HTTP 动词 
请求方法  请求地址  后端操作 
GET 
/students  获取所有学生 
POST 
/students  增加学生 
/students/1  获取编号为1 的学生 
GET 
/students/1  更新编号为1 的学生(全部属性) 
PUT 
/students/1  删除编号为1 的学生 
DELETE 
/students/1  更新编号为1 的学生(部分属性) 
PATCH 
•  过滤信息 
?limit=10:指定返回记录的数量 
?offset=10:指定返回记录的开始位置。 
?page=2&per_page=100:指定第几页,以及每页的记录数。 
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。 
?animal_type_id=1:指定筛选条件 
•  状态码 
200 OK - [GET]:服务器成功返回用户请求的数据 
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 
202 Accepted - []:表示一个请求已经进入后台排队(异步任务) 
204 NO CONTENT - [DELETE]:用户删除数据成功。 
行新建或修改数据的操作 
401 Unauthorized - []:表示用户没有权限(令牌、用户名、密码错误)。 
403 Forbidden - [] 表示用户得到授权(与 401 错误相对),但是访问是被禁止的。 
该操作是幂等的。 
是只有 XML 格式)。 
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 
错误。 
否成功。 
•  错误处理 
{ 
    error:"Invalid API key" 
} •  返回结果 
GET /collection:返回资源对象的列表(数组) 
GET /collection/resource:返回单个资源对象 
POST /collection:返回新生成的资源对象 
PUT /collection/resource:返回完整的资源对象 
PATCH /collection/resource:返回完整的资源对象 
DELETE /collection/resource:返回一个空文档 
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证
404 NOT FOUND - []:用户发出的请求针对的是不存在的记录,服务器没有进行操作,
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求 JSON 格式,但
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是
特点 
官方文档 
源码地址 
Django REST framework 
Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具. 通
常简称为DRF 框架 或 REST framework 框架. 
•  提供了定义序列化器serializer 的方法,可以快速根据Django ORM 或者其他库
自动序列化/反序列化; 
•  提供了丰富的类视图、Mixin 扩展类、简化视图的编写; 
•  丰富的定制层级: 函数视图、类视图、视图集合到自动生成API,满足各种需求; 
•  多中身份认证和权限认证方式的支持; 
•  内置了限流系统; 
•  直观的API web 界面; 
•  可扩展性, 插件丰富 
https://www.django-rest-framework.org/ 
https://github.com/encode/django-rest-framework/tree/master 
2 
INSTALLED_APPS = [ 
        '''''' 
    'rest_framework' 
] 
class Group(models.Model): 
    name = models.CharField(verbose_name='名字', max_length=100) 
  
class Student(models.Model): 
    name = models.CharField(verbose_name='名字', max_length=100) 
    age = models.IntegerField(verbose_name='年龄') 
    group = models.ForeignKey(to=Group, on_delete=models.CASCADE) 
在应用下新建一个serializers.py 文件,目的是序列化我们的模型类。 
安装 
 pip install -i https://pypi.douban.com/simple djangorestframework==3.8.
配置 
模型类 
序列化 
视图 
from .models import Student,Group 
from rest_framework import serializers 
  
class StudentSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
        model = Student 
        fields = ('id', 'name', 'age', 'group') 
  
class GroupSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
        model = Group 
        fields = ('id', 'name') 
 
       
我们对数据的增删改查全部包含在viewsets 里面这个类里面了 
from .models import Student, Group 
from rest_framework import viewsets 
from .serializers import StudentSerializer, GroupSerializer 
  
class StudentViewSet(viewsets.ModelViewSet): 
    queryset = Student.objects.all() 
    serializer_class = StudentSerializer 
  
class GroupViewSet(viewsets.ModelViewSet): 
    queryset = Group.objects.all() 
    serializer_class = GroupSerializer 
通过路由器类注册视图来自动生成API 的URL conf。 
from django.contrib import admin 
from django.urls import path, include 
from rest_framework import routers 
from app import views 
 
router = routers.DefaultRouter() 
router.register(r'users', views.StudentViewSet) 
router.register(r'groups', views.GroupViewSet) 
 
urlpatterns = [ 
    path('admin/', admin.site.urls), 
路由 
    path('api-auth/', include('rest_framework.urls', namespace='rest_fr
    path('', include(router.urls)), 
amework')) 
]  
http://127.0.0.1:8000/ 
运行