drf知识整理一

drf学习

drf :django restframework(全称)

drf框架作用是用来写接口

接口: 明确了请求方式,提供对应后台所需的参数,请求url链接可以得到后台的响应数据

(核心部分:请求方式,请求地址,请求参数,响应结果)

写接口: 参照某种规则(规范)书写url链接,同时根据规则制定请求方式,请求数据与响应结果

接口文档: 提供给前后端开发人员与测试人员查看

(写接口文档的yapi平台,访问接口的Postman工具)

接口规范:

webapi 接口规范: restful

例:
https://api.oldboy.com/v2/books/?limit=3&ordering=-price&page=2
https://api.oldboy.com/v2/books/(pk)/
#1.api关键字标识接口url
#2.在url链接中标识数据的版本  v
#3.前后台交互的数据资源(复数形式,不能带有动词,动词可以有特殊含义,但不能与资源拼接)
#4.请求方式决定资源操作
		get请求: 取   又分为单查群查
		post请求: 增   单增群增
		put请求: 改(全局)  单改群改
		patch请求: 改(局部)  单改群改
		delete请求: 删  单删群删
	由此形成十大接口
#5. 响应状态码
正常响应2xx:200  常规请求;201 创建成功
重定向响应3xx:301 永久重定向; 302  暂时重定向
客服端异常4xx:403 请求无权限;404 请求路径不存在;405 请求方法不存在
服务端异常5xx:500 服务器异常
#6.响应结果
响应的数据要有状态码,状态信息以及数据本身
```
{
     "status": 0,#状态
     "msg": "ok",#  message信息
     "results":[  #结果
 		{
             "name":"肯德基(罗餐厅)",
             "location":{  #位置
            1     "lat":31.415354,    #latitude 纬度
                 "lng":121.357339    #longtitude 经度
              },
             "address":"月罗路2380号",  #地址
             "province":"上海市",  # 省份
             "city":"上海市",   #城市
             "area":"宝山区",   #区
             "street_id":"339ed41ae1d6dc320a5cb37c",  # 街道_id
             "telephone":"(021)56761006",  #手机号
             "detail":1,   #详情
             "uid":"339ed41ae1d6dc320a5cb37c"    #唯一标识符
         }
         ...
         ]
}
```
基于原生django书写满足restful规范的接口:两个url 对应 一个视图类 完成 十大接口
	/api/users/
	/api/users/(?P<pk>\d+)/
	class User(View):
		get|post|put|patch|delete方法

CBV请求生命周期:

as_view()完成路由匹配 => url请求会调用as_view()的返回值视图函数view => 调用dispatch()完成请求分发 => 视图类的具体视图方法处理请求 => 返回给前台

安装drf:

pip install djangorestframework

drf源码入口:

直接查看 rest_framework.view的APIView的dispatch方法

​ 视图类继承drf的APIView: from rest_framework.views import APIView
​ 读懂drf的as_view()方法:返回视图函数view是,局部禁用了csrf认证 - csrf_exempt(view)
​ 请求分发的dispatch(),
​ 在分发执行视图方法前,完成了
​ 二次封装request:self.initialize_request(request, *args, **kwargs)
​ 三大认证:self.initial(request, *args, **kwargs)
​ 在视图方法处理完请求后:
​ 出现异常的处理:self.handle_exception(exc)
​ 二次封装response:self.finalize_response(request, response, *args, **kwargs)

posted @ 2019-11-30 17:53  asyouwish  阅读(202)  评论(0编辑  收藏  举报