什么是REST?

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

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

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

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

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

  1. URL的设计规范:
  2. GET 127.0.0.1:9001/books/ 获取所有数据
  3. GET:    127.0.0.1:9001/books/{id} 获取单条数据
  4. POST 127.0.0.1:9001/books/    增加数据
  5. DELETE: 127.0.0.1:9001/books/{id} 删除数据
  6. PUT: 127.0.0.1:9001/books/{id} 修改数据
  7. 数据响应规范:
  8. GET 127.0.0.1:9001/books/    返回[{}, {}, {}]
  9. GET: 127.0.0.1:9001/books/{id} {} 单条数据
  10. POST 127.0.0.1:9001/books/    {} 添加成功的数据
  11. DELETE: 127.0.0.1:9001/books/{id} "" 返回空
  12. PUT: 127.0.0.1:9001/books/{id} {} 更新后完整的数据
  13. 错误处理:
  14. { "error": "message" }

DRF

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

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

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

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

drf 框架- apiview(api类视图) - 图1

回到顶部

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() 方法

drf 框架- apiview(api类视图) - 图2

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

drf 框架- apiview(api类视图) - 图3

执行View里的 as_view() 方法

drf 框架- apiview(api类视图) - 图4

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

drf 框架- apiview(api类视图) - 图5

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

drf 框架- apiview(api类视图) - 图6

5. Request 类做了什么

drf 框架- apiview(api类视图) - 图7

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

drf 框架- apiview(api类视图) - 图8

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

drf 框架- apiview(api类视图) - 图9

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