Django REST frameworker
-
为什么使用DRF
- 在序列化与反序列化操作时,执行的过程相似,将重复的代码简化编写
- 在开发REST API视图时,每个视图具体操作数据不同,但是CURD的实现流程基本套路化
-
特点
- 构建WEB API的强大工具。(DRF框架,是建立在Django框架上,二次开发项目)
- 提供了定义序列化器Serializer方法,快速根据Django ORM自动完成数据库的序列化//反序列化
- 提供了丰富的类视图、Mixin扩展类,简化视图的编写
- 函数视图、类视图、视图集合到自动生成API。多种身份验证和权限验证支持。
- 内置限流系统。直观的API web界面
REST
>>> Repersentational State Transfer("具象状态传输"。一般解释为“表现层 状态转换”。 )
>>> REST是设计风格而不是标准,指Celent 和 Server 交互的形式。
-
Representational
具象:(表现层) Celent 访问 Server 获取资源的表现(html,txt,json。。。)
表现:获取的资源对象,以什么形式展现出来-->在HTTP请求头部中Accept和Content-Type字段中指定
State Transfer
状态转化:客户端操作数据库,必须通过某种手段,让服务器发生状态转化
HTTP协议中:4个操作方式的动词(GET、POST、PUT、DELETE )来表现 Celent 和 Server 交互的过程
RESTful架构
- 每一个URL代表一种资源
- 域名:将 api 部署在专用域名下
- 版本:将 API 的版本号放在 url 中
- 路径:路径表示 API 的具体网址。每个网址代表一种资源 。网址中不能有动词,名词一般=与数据库的表名相对应,使用复数。
- 客户端和服务器之间,传递这种资源的某种表现层
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
REST接口开发核心任务
- 将程序中的一个数据库结构类型(模型类对象)转换为响应的数据(JSON、XML、Dict)——>序列化过程
- 对数据库操作的过程。(封装了对数据库的操作方法)
- 将前端传递其他的格式(字典,JSON,XML)等转化为程序中的数据(模型类对象)——>反序列化过程
DRF工程搭建
>>>DRF框架依赖Django框架对其扩展应用,python。
- pip install djangorestframeworker
- 在INSTALLED_APPS里面注册扩展应用
Serializer序列化器
>>> 作用:1. 对数据对象进行转换、响应 2.进行数据的校验、保存
>>> 定义:1. 自定义序列化器 继承自:serializers.Serializer( 字段一一定义、校验、创建、更新)
2. 继承了最高级的序列化器语法 :serializers.ModelSerializer(指定model、fields)
创建Serializer对象
在View中调用创建好的序列化器对象
-
Serializer类构造方法:
**Serializer(instance=None, data=empty, **kwarg)
1.序列化:将模型类对象传入instance
2.反序列化:将被反序列化的数据传入data参数
3.构造Serializer对象时,可以添加context参数增加额外参数,用于View和序列化之间数据的传递
在序列化文件中通过context参数附加的数据,可以通过Serializer对象的context属性获取。
序列化
获取模型类对象(根据模型类对象Django-ORM的CURD)
创建序列化器对象—>序列化操作(将模型类对象传入)
获取序列化的自定义字段(或者根据模型类字段,进行定义)
-
序列化器对象.data:data属性获取序列化对象的数据(字典,返回的数据就是定义在序列化器中定义的字段)
ser = BookInfoSerializer1(books, many=True)
return Response(ser.data)
反序列化器
反序列化时,需要对请求的数据验证成功,才能对数据修改/保存模型类对象
反序列化前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False
验证失败,可使用序列化器对象的errors属性获取错误信息,字典形式返回{ '字段':'错误信息' }
-
验证成功,可使用序列化器对象的validated_data属性获取数据.
1.先获取数据
data = request.data
2.对获取的数据进行校验
ser = Serializer(data=data)
ser.is_valid()
3.添加数据
ser.save()
返回数据
return Response(ser.data)
反序列化注意点
- 在对序列化器进行save()保存时,可以额外传递数据,这些数据可以在create()和update()中的validated_data参数获取到。
ser.save(owner=request.user)
def create(self, validated_data):
owner = validated_data.get('owner', None)
pass
def update(self, instance, validated_data):
instance.owner = validated_data.get('owner', None)
pass
-
默认序列化器必须传递所有required的字段,否则会抛出验证异常。但是我们可以使用partial参数来允许部分字段更新
ser = Serializer(obj, data=data,partial=True)
视图
Request
REST framework 提供了Parser解析器,请求后会自动根据Content-Type指明的请求数据类型,将请求数据进行parse解析,解析为类字典对象保存到Request对象中。
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
属性
- .data
request.data 返回解析之后的请求体数据
- .query_params
request.query_params与Django标准的request.GET相同。
-
.user
请求的用户对象(获取已登陆的用户请求对象)
Response
-
REST framework提供了一个响应类
Response
,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。Response响应构造方式:
Response(data, status=None, template_name=None, headers=None, content_type=None)
data:传给response对象的序列化后,但是没有render处理的数据
REST framework提供了
Renderer
渲染器,用来根据请求头中的Accept
(接收数据类型声明)来自动转换响应数据到对应格式。
状态码
信息告知 -1X
成功 -2X
重定向-3X(成功请求)
客户端请求错误-4X
服务器错误-5X
视图两个基类
>>>作用:1.控制序列化器的执行 。2. 控制数据库查询的执行
APIView
封装继承Django的View父类,提供了所有的视图基类
APIView视图中没有封装HTTP的动作方法;还需自定义方法
APIView和View的区别
传入了视图Resquest和Response对象不同
任何APIException异常都会被捕获到
-
在基类View进行dispatch()分发前,会对请求进行身份验证、权限验证、流量控制
属性
- authentication_classes :身份验证
- permissoin_classes :权限认证
- throttle_classes :流量控制
GenericAPIView
序列化器使用:
-
属性和方法
属性: serializer_class指明视图中使用的序列化器
方法:get_serializer() 获取序列化器对象(可重写)
注意点:该方法提供序列化器对象的时候,会向序列化器对象的context属性传递三个数据 。
def get_serializer(self, *args, **kwargs): """ Return the serializer instance that should be used for validating and deserializing input, and for serializing output. """ serializer_class = self.get_serializer_class() kwargs['context'] = self.get_serializer_context() # 返回序列化器对象 return serializer_class(*args, **kwargs) def get_serializer_context(self): """ 在定义序列化器对象时候使用,会向序列化器对象的context属性补充三个数据 """ return { 'request': self.request, # 当前视图的请求对象 'format': self.format_kwarg, 'view': self #当前请求的类视图对象 }
数据库的使用:
-
属性和方法:
属性:queryset 指明数据库的查询集—>数据库特性:惰性/缓存
方法:get_queryset()获取数据对象,返回查询集queryset属性;get_object(self)获取单个的查询对象
def get_query(self): "对其方法的重写,返回指定的查询集对象" category_id = self.kwargs["category_id"] # 向指定的查询集添加属性;获取分类id对象 hot_skus = SKu.object.filter(category_id=category_id,is_launched=True) return hot_skus def view(request, *args, **kwargs): """在路由中获取数据,保存在View视图中“”“ self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request # 。。。 self.args = args self.kwargs = kwargs # 。。。 return self.dispatch(request, *args, **kwargs)
-
其他属性
pagination_class 指明分页控制类(自定义分页器)
class LargeResultsSetPagination(PageNumberPagination): """ 自定义分页器,继承分页器PageNumberPagination 请求方法:127.0.0.1/books/?page=1&page_size=5 """ page_size = 5 # 每页的数量 max_page_size = 10 # 前端最多能设置的每页数量 # page_query_param = 'page' # 前端发送的页数关键字名,默认为"page" page_size_query_param = 'page_size' # 前端发送的每页数目关键字名,默认为None
filter_backends 指明过滤控制后端
五个扩展类
作用:提供后端视图对数据库的CURD处理流程的实现,继承扩展类来复用代码
两个基本类:就是为扩展类提供属性和方法。五个扩展类需要搭配基类(GenericAPIView)
要实现序列化器与数据库的查询的方法。
-
方法
1)ListModelMixin 2)CreateModelMixin
3) RetrieveModelMixin 4)UpdateModelMixin 5)DestroyModelMixin