# DRF框架
Django REST framework 框架是一个基于django用于构建Web API 的强大而又灵活的工具
特点:
- 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
- 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
- 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;多种身份认证和权限认证方式的支持;
- 内置了限流系统;
- 直观的 API web 界面;
- 可扩展性,插件丰富
对django的增加
# 使用方式
安装
pip install djangorestframework
注册 在settings.py的INSTALLED_APPS中添加'rest_framework'
INSTALLED_APPS = [ ... 'rest_framework', ]
# 功能
# 倪补django序列化
# 自建序列化类
继承rest_framework.serializers.Serializer
class UserInfoSerializer(serializers.Serializer):
"""用户信息序列化器"""
name = serializers.CharField(help_text='用户信息', max_length=18,required=True)
pwd = serializers.CharField(help_text='密码', min_length=6, max_length=18, required=True)
email = serializers.EmailField(help_text='邮箱', required=True)
age = serializers.IntegerField(help_text='年龄', max_value=200,min_value=0)
字段类型参考文档
序列化: 将python对象 ---> 转换为json格式数据
from rest_framework.renderers import JSONRenderer # 查询用户对象 obj = UserInfo.objects.get(id=1) # 创建序列化对对象 u = UserInfoSerializer(obj) # 将得到的字段,转换为json数据 JSONRenderer().render(u.data)
反序列化: 将json格式数据 转换为python对象
# 反序列化 ser = UserInfoSerializer(data=data) # 校验数据 ser.is_valid() # 保存数据 ser.save()
# 模型序列化
为了方便我们定义序列化器,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类
ModelSerializer与常规的Serializer相同,但提供了:
- 基于模型类自动生成一系列字段
- 基于模型类自动为Serializer生成validators,比如unique_together
- 包含默认的create()和update()的实现
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
# fields = '__all__' # 所有字段
fields = ('id','age','pwd') # 指定序列化得字段
exclude = ('id',) # id字段不参与序列化
read_only_fields = ('id',) # 只读字段
# 通过字段名指定字段对应的参数和值
extra_kwargs = {
'pwd': {'min_value': 0, 'required': True},
}
# 请求和响应
# request
REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据
- request.data属性
request.data 获取请求体数据。
- 支持 · POST , PATCH 方法传递的请求体参数
- 不仅支持表单类型数据,也支持JSON数据,还支持文件数据的获取
- request.query_params属性 request.query_params获取查询字符串参数的,Django的 request.GET 的作用一样
# response
REST framework提供了一个响应类 Response ,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
Response(data, status=None, template_name=None, headers=None, content_type=None)
data 不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer 序列化器序列化处理后(转为了Python字典类型)再传递给data 参数
Response参数说明:
- data: 为响应准备的序列化处理后的数据;
- status: 状态码,默认200;
- template_name: 模板名称,如果使用HTMLRenderer 时需指明;
- headers: 用于存放响应头信息的字典;
- content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数
# 视图装饰器
REST 框架提供了两个可用于编写 API 视图的包装器。
- 用于处理基于函数的视图的装饰器。@api_view
- 用于处理基于类的视图的类。 APIView
下面我们通过@api_view 这个装饰器来实现增删查改接口