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() 方法来执行认证,权限,频率的控制。