Django rest framework框架——APIview源码分析
一、什么是rest
REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP。其目标是为了创建具有良好扩展性的分布式系统。
可用一句话总结:url用来唯一定位资源, 用http请求方式来区分用户对数据的操作方式。
http://www.scienjus.com/my-restful-api-best-practices/
rest下的url
1. 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} # 修改数据 2. 数据响应规范
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} # {} 更新后完整的数据 3. 错误处理
{ "error": "message" }
二、APIView源码分析
class LoginView(APIView):
def get(self, request):
pass def post(self, request):
request.data # 新的request对象 @property
return
class APIView(View):
@classmethod
def as_view(cls, **initkwargs):
pass
super(APIView, cls).as_view(**initkwargs) def initialize_request(self, request, *args, **kwargs): from rest_framework.request import Request return Request(
request, # 原生request对象
parsers=self.get_parsers(), #
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
) def dispatch(self):
pass
request = self.initialize_request(request, *args, **kwargs)
self.request = request def get_parsers(self): return [parser() for parser in self.parser_classes]
1. views.LoginView.as_view()
2. LoginView里面没有as_view方法,到父类APIView去找
3. 执行View里面的as_view()方法,返回view函数 4. url和视图函数之间的绑定关系建立完毕 { "login": view},等待用户请求
5. 接收到用户请求:login,到建立好的绑定关系里面执行对应的视图函数:view(request)
6. 视图函数的执行结果是什么就返回给用户什么:self.dispatch(), self.dispatch()的执行结果是什么,就返回给用户什么
7. 此时的self代表的是LoginView的实例化对象
8. 开始找dispatch方法,self里面没有,LoginView里面也没有,在APIView里面有
9. 开始执行APIView里面的dispatch
10. 最后找到http方法(GET,POST,PUT,DELETE),根据请求类型查找(request.method.lower())
11. 开始执行找到的方法(GET),self.get(), self此时代表LoginView的实例化对象
11.1 假设接收到的是POST请求, 执行request.data
11.2 根据分析,所有的解析工作都在request.data里面实现,且data是一个方法(被装饰后的)
11.2 开始执行request.data @property
def data(self):
if not _hasattr(self, '_full_data'):
self._load_data_and_files()
return self._full_data
11.3 执行self._load_data_and_files
11.4 执行self._data, self._files = self._parse()
11.5 parser = self.negotiator.select_parser(self, self.parsers) 11.5.1 开始找self.parsers
11.5.2 self.get_parses()
[ parse() for parse in self.parser_classes ]
11.5.3 parser_classes = api_settings.DEFAULT_PARSER_CLASSES
11.5.4 from rest_framework import api_settings
11.5.5 api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS) 11.5.6 class APISettings():pass
11.5.7 找不到DEFAULT_PARSER_CLASSES,__getattr__
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
),
11.5.8 首先找程序的settings
11.5.9 然后找rest_framework的settings 11.6 self._data就是我们想要的数据
11.7 DRF将self._data = data
11.8 request.data 12. 在LoginView里面找到了对应的方法,执行该方法,最后返回给用户 - DRF的所有功能都是在as_view()和dispatch里面重写的
- 而解析器组件在dispatch方法里面重写了,具体是在重新封装的Request对象里面
Django rest framework框架——APIview源码分析的更多相关文章
- Django REST framework —— 认证组件源码分析
我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...
- Django REST framework —— 权限组件源码分析
在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 class ShoppingCarView(ViewSetMix ...
- Django rest framework 权限操作(源码分析)
知识回顾http://www.cnblogs.com/ctztake/p/8419059.html 这一篇是基于上一篇写的,上一篇谢了认证的具体流程,看懂了上一篇这一篇才能看懂, 当用户访问是 首先执 ...
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- CBV源码分析+APIVIew源码分析
{drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...
- Restful规范-APIView源码分析
目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...
- 高性能网络I/O框架-netmap源码分析
from:http://blog.chinaunix.net/uid-23629988-id-3594118.html 博主这篇文章写的很好 感觉很有借签意义 值得阅读 高性能网络I/O框架-netm ...
- django的RestFramework模块的源码分析
一.APIView源码分析 查看源码的前提要知道,找函数方法必须先在自己的类中找,没有再往父类找,一层一层网上找,不能直接按ctrl点击 在我们自己定义的类中没有as_view方法的函数,所以肯定是继 ...
随机推荐
- JAVA事件监听机制的实现
今天学习了java的事件编程机制,略有体会,先在此记下心得. 第一,首先明确几个概念. 事件源:一个产生或者触发事件的对象.事件:承载事件源状态改变时的信息对象.事件监听器接口:实际上就是一个类,该类 ...
- 谈谈contentWindow 和contentDocument以及 iframe
1,contentWindow:是用来获取子窗口的window对象的,它兼容各大浏览器,用法如下 document.getElementById("iframeId").conte ...
- VMWARE 虚拟机新增硬盘,格式化分区,并挂载
VMWARE 虚拟机新增 硬盘 并挂载 一台虚拟机上安装ORACLE12c 需要分一块硬盘挂载数据文件 日志文件 以及归档文件 1. 关闭虚拟机 2. 编辑虚拟机设置 选择[编辑虚拟机设置]并打开,将 ...
- 你是真的了解ssh吗 说说你不知道的ssh
Ssh命令——基石天赋 主要参数说明: -l 指定登入用户 -p 设置端口号 -f 后台运行,并推荐加上 -n 参数 -n 将标准输入重定向到 /dev/null,防止读取标准输入 -N 不执行远程命 ...
- Django中间件CsrfViewMiddleware源码分析
Django Documentation csrf保护基于以下: 1, 一个CSRF cookie基于一个随机生成的值,其他网站无法得到,次cookie有CsrfViewMiddleware产生.它与 ...
- 刷题向》DP》放苹果 (normal)
这篇博客可能字数比较多,而且很难讲清楚,我会努力给你们讲清楚: 首先,放苹果是一道DP,之所以难,是因为很难想到,我的确有同学用三维数组做出来,然而三维的的确比二维好理解,但三维复杂度太高,虽然DP一 ...
- 利用Chrome的Performance工具排查页面性能问题(原叫timeline)
当页面中发生卡顿,最先考虑的是swf文件造成的卡顿,经过排查发现不是swf造成的影响,利用Chrome的Performance工具发现页面中的一些元素不断在重新布局,造成潜在的性能瓶颈. 首先在Chr ...
- Luogu 3265 [JLOI2015]装备购买
BZOJ 4004 把所有不能相互表示出来的向量都买下,一定能得到最大能买的方案数. 求解线性无关向量可以高斯消元,最后没有变成$0$向量的就是基底. 本题还要求代价最小怎么办?我们只要先把所有向量按 ...
- readfile()
readfile()将一个文件写入到输出缓存参数1:文件名
- nodelet的理解
1.介绍 nodelet包可以为在相同进程中的多个算法之间实现零拷贝的传输方式. 这个包也提供了实现一个nodelet所需的nodelet基类以及用于实例化nodelet的NodeletLoader类 ...