Django-Rest-Framework

  

什么是DRF框架

DRF是一个构建web API的框架,所谓API也就是我们开发的web应用的接口,不同的框架 有其不同的rest framework,它更像一个帮助我们开发的APP。

 

功能实现

- 提供了丰富的类视图,Mixin扩展类,简化视图的编写。
- 丰富的定制层级,函数视图,类视图,视图集合自动生成API
- 身份认证、权限认证、频率认证
- 序列化,提供了定义序列化器 Seriallzer的方法,根据django orm快速进行序列化和反序列化的开发。

 

 REST解释

用url唯一定位资源,用Http请求的方(GET,POST,DELETE,PUT)描述用户行为,对数据的操作最常见的就是crud(创建,读取,更新,删除)

 

http协议

http协议半酣三部分:请求行,请求报文头,请求报文体。

 

APIview

APIview用来分发请求,通过其源码中定义的反射来查找request.method.lower(),也就是get,post等方法中的一个,流程如下图所示。![DRF006](C:\Users\MK\Desktop\DRF006.png)

 解析器组件

json是使用广泛的数据传输格式,django的request.post并不能支持获取json格式的数据,得到的是queryset的空对象,只能通过request.body来手动解析数据(先通过decode进行编码,然后通过loads反序列化)

 

 解析器组件的使用

- 导入模块,from rest_framework.views import APIView
- 继承APIview
- 直接使用request.data就可以获取数据

如何制定只解析json类数据

- from rest_framework.parsers import JsonParser
- 给视图类定义一个parser_classes变量,值为列表类型[JsonParser],若为空列表,就不会处理任何数据请求。

 

解析器组件的实现

通过继承APIVIew,重写了as_view和dispatch方法,具体流程如下:![parser001](C:\Users\MK\Desktop\parser001.png)

 

 序列化组件

 序列化组件的作用

在我们通过传统的方式发送json数据时,需要自己定义json的数据格式,十分麻烦,当我们使用序列化组件来定义接口时就相对简单,但是原生的序列花组建,没有保存记录和数据校验的功能

 

序列化组件的使用

- 定义model类
- 通过序列化组件进行url接口的设计
- 导入序列化组件:from rest_framework import serializers,
- 定义序列化类,继承serializers.Serializer(建立一个单独的文件,app_serlizers.py),可以对比forms组件,其中定义的字段代表着稍后要取出的数据,如果字段名和model里定义的字段名不同,那么需要使用source参数声明一下是哪个字段。
- 在视图函数中,取得queryset类型的数据,然后取得序列化类的实例对象,第一个参数时取得的数据,第二个参数是many,默认是false,如果取得的数据是字典嵌套列表类型,那么就将many设为True。
- 返回实例化对象的data属性。

 

对于Post请求

- url定义:需要为post新增url,因为根据规范,url定位资源,http请求方式定义用户行为
- 定义post方法:在视图类中定义post方法
- 开始序列化:通过我们上面定义的序列化类,创建一个序列化对象,传入参数为data = request.data的数据。
- 校验数据:通过实例对象的is_valid()方法,对请求数据的合法性进行校验
- 保存数据:调用save()方法,将数据插入数据库
- 插入数据到多对多关系表:如果有多对多字段,手动插入数据到多对多关系表
- 返回:将插入的对象返回

为了避免多对多数据的定义问题,使用ModelSerialzer,并且通过extra_kwargs={write_only},并且在元类中不重新定义fields,而是指定,可以类比form组件的编写。

#### 视图组件

 视图组件的实用意义

如果开发涉及的接口过多,会导致重复代码的数量增多,利用多继承或mixin的方式,去重代码,在这里可以认为是把基本的请求和响应抽出来,封装成几个基类,然后使用的时候把基类继承使用,就叫做mixin

#### 认证组件

#### 权限组件

#### 频率控制组件

 

 分页组件

 使用步骤

- 导入模块 from rest_framework.pagination import PageNumberPagination
- 获取数据 books = Book.objects.all()
- 创建分页器 paginater = PageNumberPagination()
- 开始分页 page_books = paginater.paginate_quertset(books,request)
- 将分页后的数据进行序列化 serialized_data = Bookserializer(paged_books,many = True)
- return response(serialized_data.data)

 

 响应器组件

 使用步骤

- 导入模块 from rest_framework.renderers import JSONRenderer
- render_classes = [JSONRenderer]
- throttle_classes = [RateThrottle]
- queryset = Book.objecct.all()
- serializer_class = BookSerializer

 

url注册器

使用步骤

- 导入模块,from rest_framework import router
- 实例化router对象,router = DefaultRouter()
- 将需要自动生成url的接口注册到router,router.register(r'books',views.bookview)
- 生成url,re_path("",include(router.urls))

 

转载于:https://www.cnblogs.com/cuiyuanzhang/p/10099452.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值