DRF Django REST framework 之 APIView(一)

什么是REST?

REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用。

使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减少不必要的讨论时间。

  • GET:          获取特定资源(通过ID)或资源集合
  • POST:   创建一个新资源
  • PUT:          更新特定资源(通过ID)
  • DELETE:    按ID删除特定资源

详情可见:https://baike.baidu.com/item/rest/6330506

可以理解为: URL唯一代表资源,HTTP请求方式来区分用户行为。

URL的设计规范:
GET:     127.0.0.1:9001/books/	       获取所有数据
GET:    127.0.0.1:9001/books/{id}     获取单条数据
POST:    127.0.0.1:9001/books/	      增加数据
DELETE:  127.0.0.1:9001/books/{id}     删除数据
PUT:     127.0.0.1:9001/books/{id}     修改数据

数据响应规范:
GET:     127.0.0.1:9001/books/	     返回[{}, {}, {}]
GET:      127.0.0.1:9001/books/{id}    {} 单条数据
POST:    127.0.0.1:9001/books/	      {} 添加成功的数据
DELETE:   127.0.0.1:9001/books/{id}    "" 返回空
PUT:      127.0.0.1:9001/books/{id}    {} 更新后完整的数据

错误处理:
{ "error": "message" }

 DRF

DRF (Django REST framework)Django REST框架是用于构建Web API的工具, 是功能强大且灵活的工具包。

通常简称为DRF框架 或 REST framework。DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目。

DRF中有封装了十大组件,分别是序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,url控制器,版本控制。这十大组件,能够很好的帮助开发人员提升开发效率。

可以用来实现前后端分离的项目

APIView

 APIView 是DRF概念体系中最基本类视图,也是所有视图的基类,继承自Django的 View 父类。

 APIView 与 View 的不同之处在于:

  • 传入到视图方法中的是REST framework的 Request 对象,而不是Django的 HttpRequeset 对象;
  • 视图方法可以返回REST framework的 Response 对象,视图会为响应数据设置 render 符合前端要求的格式;
  • 任何 APIException 异常都会被捕获到,并且处理成合适的响应信息;
  • 在进行 dispatch() 分发前,会对请求进行身份认证、权限检查、流量控制
支持定义的属性:
  •  authentication_classes  列表或元祖,身份认证类
  •  permissoin_classes  列表或元祖,权限检查类
  •  throttle_classes  列表或元祖,流量控制类

在 APIView 中仍以常规的类视图定义方法来实现 get()  、 post()  或者其他请求方式的方法。

APIView源码分析

1. 路由层调用 as_view() 方法

2. 由于视图类 LoginView 类没有 as_view() 方法,所以去父类APIView中找

执行View里的 as_view() 方法

3.  as_view() 最终还是执行类 APIView 里的 dispatch() 方法。

4. 通过 initialize_request() 将原生 request 封装到 Request 中,依次执行 initial() 里面的认证,权限,概率组件

5.  Request 类做了什么

把一些常用的方法重新封装了,如GET方法封装成了query_params,并伪装成属性。

6. 最后通过映射进行分发,并返回

DRF的关键就是重写了 dispatch 方法,在 dispatch 中对原生的 request 进行了封装,然后通过 initial() 方法来执行认证,权限,频率的控制。

posted @ 2019-12-09 16:14  Nolinked  阅读(3231)  评论(0编辑  收藏  举报