目录
一、DRF框架安装
- DRF是Django插件,所以要提前安装Django
- 运行命令
pip install djangorstframework
- 使用DRF时要在settings.py注册app:
INSTALLED_APPS = [..., 'rest_framework']
- 基于CBV完成满足RSSTful规范的接口
二、接口
(一)什么是接口
- 接口:规定了提交请求参数的请求方式,访问其可以获取响应的反馈数据的url链接
- 四大特点
- url链接:长得像返回数据的url链接
- 请求方式:get、post、put、patch、delete
- 请求参数:json或xml格式的key-valu类型e数据
- 响应结果:json或xml格式的数据
(二)接口规范(restful)
(1)url链接
- 采用https协议:接口都是操作前后台数据的数据,所以需要保证数据的安全性
- API关键字:接口用来操作数据,与网址(操作页面)有区别,所以使用特定的关键字表示
- 资源名词:接口操作的数据称之为资源,在url中只体现资源名称,不体现操作资源的方式(https://api.baidu.com/get_books/),而是通过请求方式来确定操作资源方式
- 常规资源接口
- https://api.baidu.com/books/
- https://api.baidu.com/books/(pk)/
- 非常规接口:和某资源不是特别密切或者不止一种资源
- https://api.baidu.com/books/login/
- https://api.baidu.com/books/place/search/
- 常规资源接口
- 多版本共存:如果一个资源存在多版本结果,在url链接中要用特定符号来兼容多版本共存
https://api.baidu.com/v1/books/
- https://api.baidu.com/v2/books/
?限制条件:群资源操作一般还有额外的限制条件,如排序、限制调试、分页等等
- https://api.baidu.com/v1/books/?ordering=price&limit=3/
(2)请求方式
- get请求:获取单个或多个资源
https://api.baidu.com/books/:群查,返回多个结果对象
- https://api.baidu.com/books/(pk)/:单查,返回一个结果对象
post请求:新增单个或多个资源
- https://api.baidu.com/books:单增和全增都是该接口,对应返回单个或多个结果对象
- put请求:整体修改单个或多个资源
https://api.baidu.com/books/:整体修改多个,提供多个数据字典(要包含主键)的数组,完成群改,返回多个结果对象
- https://api.baidu.com/books/(pk)/:整体修改单个,提供的单个数据字典(主键在url中体现),完成单改,返回单个结果对象
- patch请求:局部修改单个或多个资源(常用)
- 方式与put完全相同
- 不同点:操作的资源如果有5个key-value键值对,put请求提供的字典必须全包含,但是patch提供字典包含的键值对0~5个都可以
- delete请求:删除单个或多个资源
- https://api.baidu.com/books/:多删,提供多个资源主键数据,没有资源返回(一般会自定义返回结果信息:成功或失败)
- https://api.baidu.com/books/(pk)/:单删,不需要提供额外数据,没有资源返回(一般会自定义返回结果信息:成功或失败)
(3)响应结果
- 网络状态码:响应对象中要包含网络状态码(网络状态信息和网络状态码捆绑出现,不用额外设置)
1xx:基本信息
2xx:成功
200:基本
201:新增成功
3xx:重定向
4xx:客户端错误
- 400:错误请求
- 403:请求无权限
- 404:请求资源不存在
- 5xx:服务端错误
- 500:服务器错误
- 数据状态码(一般都是前后台约定规则,具体信息要在接口文档中明确写出)
0:成功
1:失败
2:无数据
数据状态码信息:一般不仅仅是对数据状态码的解释,更多的是对结果的描述,给前后端开发者阅读的
{ "status":0, 'msg':'ok' }
数据结果(常量、数组、字典),如果有子资源(图片、视频、音频),返回资源的url连接
{ "status":0, "msg":'ok', "results":[{ "name":"西游记", "img":"https://api.naidu.com/book/xyj.jpg" },{}] }
(三)数据接口文档:YApi
- YApi是去哪网大前端技术中心的一个开源可视化接口管理平台
- 可以搭建在任何本地或云服务器上,完成后台项目开发时的接口编写
- YApi的测试网站:http://yapi.demo.qunar.com/
(四)Postman接口测试工具
- Postman是一个免费的可视化接口调试工具,同时支持各种操作平台
- Postman下载地址:https://www.getpostman.com/downloads/
三、DRF请求生命周期(CBV源码)
项目一启动就会自动执行as_view方法,返回调用函数view(本质上也是FBV)
函数view中返回调用对象的dispatch方法
@classonlymethod def as_view(cls, **initkwargs): for key in initkwargs:…… # initkwargs没有进行赋值,该逻辑不会执行 def view(request, *args, **kwargs): # 请求来了完成响应的函数 self = cls(**initkwargs) # cls是我们自己写的类 MyLogin self是我们自己定义的类的对象 self.request = request # wsgi协议包装数据后的request self.args = args # 无名分组参数 self.kwargs = kwargs # 有名分组参数 return self.dispatch(request, *args, **kwargs) # view返回什么,用户就能看到什么 # 将请求来调用view的修改信息保存在view对象中 view.view_class = cls view.view_initkwargs = initkwargs # 看源码的时候一定要注意在查找属性和方法的时候先从对象自身找,再去类中查找,再去父类查找 return view # 返回请求调用的函数地址,进行路由绑定
dispatch函数中利用反射方法获得请求的方式,从而调用对应方法
def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. # 判断当前请求方式在不在默认的八个方法内 # 1.先以GET请求为例 if request.method.lower() in self.http_method_names: # 利用反射去我们自己定义类的对象中查找get属性或者是方法 getattr(obj,'get') # handler = get方法 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) # 调用get方法