DRF的使用
一、DRF 简介
django restframework(简称drf)是一套基于 Django 的 restful 风格框架,里面集成了很多 restful API 相关的便捷功能。
官网地址:https://www.django-rest-framework.org/
二、DRF 快速上手
1. 安装
由于 DRF 是基于 Django 的,因此使用前必须先安装 Django,且对版本有一定的要求,先本地检查下版本是否正确:
1 | |
执行 pip 命令安装 drf 框架
1 | |
2. 修改配置文件
安装完成以后查看目录结构,我们可以发现 DRF 的目录结构和我们在 Django 项目中新建的 App 是很类似的。
其实 DRF 本质上就是一个别人写好的 Django 下的 App,里面帮我们封装了很多的功能,所以使用前必须注册
1 | |
此外,要想使用 DRF 提供的其他功能,也必须在 settings.py 中配置:
1 | |
3. 编写视图层接口
1 | |
1 | |
启动服务,打开浏览器访问:http://127.0.0.1:8000/user/,可以看到以下界面,`DRF` 不仅优化了结果展示界面,还提供了简单调试接口的功能 :
三、DRF 原理分析
DRF 中视图层是基于 CBV 模式进行开发的,其原理也和 django.views.View 类似,我们可以结合源码来看下:
第一步,当路由系统匹配到访问的地址后缀为
/user/时,会执行QueryUserView视图类中的as_view方法;第二步,我们自己定义的视图类中并没有
as_view这个方法,所以要再去继承的父类APIView中寻找;第三步,
APIView类的as_veiw方法中,执行了它父类中的as_view方法:1
view = super().as_view(**initkwargs)即最终调用的其实是
django.view.View中的as_view方法;第四步,
django.view.View的as_view方法中,定义了一个view函数对象,函数中会执行一个dispatch方法,并把接收到的相关的参数都传给函数对象,最终返回这个函数;第五步,
APIView类的as_veiw方法中,在执行完父类的as_view方法拿到返回的函数对象后,又对该函数做了一个免除csrf token校验的操作:1
return csrf_exempt(view)第六步,执行
dispatch方法,首先还是先去我们自己定义的视图类中寻找,找不到再去父类APIView中寻找,再找不到就继续去APIView的父类中寻找…… 最终我们在APIView中就已经找到了该方法。我们先关注dispatch方法中的这一部分:1
2
3
4
5
6
7if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
response = handler(request, *args, **kwargs)主要做了以下几件事情:
- 对请求的类型进行全小写处理,即请求类型 GET/POST/PUT/DELETE 等会转换成 get/post/put/delete
- 判断请求的类型是否在框架支持的范围内
- 利用类的反射机制去视图类中寻找是否存在和请求类型同名的方法,如果存在,就执行该方法。这就是为什么我们只需要在视图类中去定义
get()、post()等方法就能自动去处理对应请求类型的原因。