Django DRF APIView源码运行流程详解


Posted in Python onAugust 17, 2020

首先写一个简单的drf接口

from rest_framework.views import APIView
from rest_framework.response import Response

# 基于drf写接口,cbv
class DrfTest(APIView):
  def get(self, request,*args,**kwargs):
    print(type(request._request))
    print(type(request))
    print(request.POST)
    print(request.GET)
    response = {'status':100,'errors':None}
    response['users'] = user_list
    return Response(response)

  def post(self,request,*args,**kwargs):
    name = request.data.get('name')
    print(name)
    return HttpResponse('ok')
url(r'DrfTest/',views.DrfTest.as_view()),

通过路由配置 点入查看源码,首先进入到APIView的as_view的方法中:

Django DRF APIView源码运行流程详解

Django DRF APIView源码运行流程详解

查找dispatch方法:

Django DRF APIView源码运行流程详解

如果自己所定义的class DrfTest(APIView)没有手撸dispatch的情况下,下一步,找到APIView里的dispatch方法:

Django DRF APIView源码运行流程详解

当中有一个self.initial(request, *args, **kwargs)方法:

Django DRF APIView源码运行流程详解

至此,简单分析如上:回到最开始定义类的过程:

Django DRF APIView源码运行流程详解

流程总结

  • 请求来了,执行了View类中as_view的view()方法,本质上执行了self.dispatch方法
  • 按顺序查找dispatch方法(自己类中,父类中,父父类中...)
  • 在APIView中的dispatch方法中先把原来request封装进去,变成新的request对象
  • 接下来又执行了三个组件,分别是认证,权限和频率
  • 如果三个中有一个不满足,则不继续执行
  • 再走分发方法,最后返回response出去
  • 即在请求进入视图函数前加了一些东西,重写了dispatch方法

dispatch方法:

  • 传入的request是原生的request对象
  • 这个request已经不是原生的request了,但是它内部有个原生的request对象
  • request = self.initialize_request(request, *args, **kwargs)
  • self.initial(request, *args, **kwargs)这里面有权限,认证,频率

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
python自动发送邮件脚本
Jun 20 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
python字符串查找函数的用法详解
Jul 08 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
tensorflow模型转ncnn的操作方式
May 25 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
浅谈Python协程
Jun 17 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
详解python模块pychartdir安装及导入问题
Oct 22 Python
pandas抽取行列数据的几种方法
Dec 13 Python
django中websocket的具体使用
Jan 22 Python
Django CBV模型源码运行流程详解
Aug 17 #Python
无惧面试,带你搞懂python 装饰器
Aug 17 #Python
Python Request类源码实现方法及原理解析
Aug 17 #Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 #Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 #Python
Django DRF认证组件流程实现原理详解
Aug 17 #Python
python使用建议与技巧分享(二)
Aug 17 #Python
You might like
Look And Say 序列php实现代码
2011/05/22 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
浅谈Python的垃圾回收机制
2016/12/17 Python
机器学习python实战之决策树
2017/11/01 Python
Python中安装easy_install的方法
2018/11/18 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
好的演讲稿开场白
2013/12/30 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
党课培训主持词
2014/04/01 职场文书
自主招生学校推荐信
2014/09/26 职场文书
聚会通知怎么写
2015/04/23 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫