drf 全称 Django REST framework 属于前后端分离的一种,与django最大的区别也在于此!!
前后端分离
前后端不分离
RESTful API
drf编写的规范是以restful API为基础构造的,按我的理解来说就是只要满足restfulAPI的第五条也就是不同的请求方式代表不同的方法,那么此程序就是属于符合restfulAPI规范的!
具体的规范为
- 数据的安全保障
简单来说就是采用https协议来传输数据 - 接口特征表现
如果该接口为前后端交互的或者资源互换的应该用api关键字标识接口url
例如:
https://api.baidu.com/
https://www.baidu.com/api - 多数据版本共存
这个没什么好说的,就是不同的版本
https://api.baidu.com/v1
https://api.baidu.com/v2 - 数据即是资源,均使用名词(可复数)
一般来说在url不会出现动词,因为这样有可能会暴露一些信息
例如:
https://api.baidu.com/users
https://api.baidu.com/books
https://api.baidu.com/book - 资源操作由请求方式决定(method)
不同的请求对应不同的操作。
在drf中我知道的有5种
1.get请求代表获取资源(单个或者全部)
2.post请求代表创建新增
3.put请求代表修改整个数据
4.patch请求代表修改部分数据
5.delete请求代表删除 - 过滤,通过在url上传参的形式传递搜索条件
就是查找对应的数据,通常使用get请求获取资源 - 响应状态码
- 1XX(资源请求成功正在获取)
- 2XX(正常相应)
200(常规请求)
201(创建成功) - 3XX(重定向)
301(永久重定向)
302(暂时重定向) - 4XX(客户端异常)
403(请求无权限)
404(请求路径不存在)
405(请求方法不存在) - 5XX(服务端异常)
500(服务器异常)
- 错误处理,应返回错误信息,error当做key
{
error: “无权限操作”
} - 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档
10.需要url请求的资源需要访问资源的请求链接
{
"status": 0,
"msg": "ok",
"results":[
{
"name":"肯德基(罗餐厅)",
"img": "https://image.baidu.com/kfc/001.png"
}
...
]
}
序列化
api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:
序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。
反序列化:把别人提供的数据转换/还原成我们需要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。
Django Rest_Framework
核心思想: 缩减编写api接口的代码
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
特点
- 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
- 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
- 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
- 多种身份认证和权限认证方式的支持;
- 内置了限流系统;
- 直观的 API web 界面;
- 可扩展性,插件丰富
序列化器
在序列器中有两种序列化器。一种为serializers.Serializer,另一种为serializers.ModelSerializer。对于这个两个区别可以去看我从别人那转载过来的另一篇博客!
class BookSerializer(serializers.Serializer):
user=serializers.CharField()
password=serializers.CharField()
re_password=serializers.CharField()
在序列化器中定义的字段其实可以和django中的forms组件相对应起来!
例如:
序列化组件修改数据
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值
read_only 表明该字段仅用于序列化输出,默认False,如果设置成True,postman中可以看到该字段,修改时,不需要传该字段
write_only 表明该字段仅用于反序列化输入,默认False,如果设置成True,postman中看不到该字段,修改时,该字段需要传
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 该字段使用的验证器
error_messages 包含错误编号与错误信息的字典
公共用法
钩子函数
在这里跟django用法差不多,只是定义的方法名还有返回错误的信息不一样!
局部钩子
def validate_price(self, data): # validate_字段名 接收一个参数
if float(data)>10:
return data #拿来必定要回去
else:
raise ValidationError('价格太低') #相当于django的self.add_errors()
全局钩子
def validate(self, validate_data): # 全局钩子
password=validate_data.get('password')
re_password=validate_data.get('re_password')
if password != re_password:
raise ValidationError('两次密码不一致')
else:
return validate_data