目录
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/
运行