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双向链表实现实例代码
Nov 21 Python
Python实现微信公众平台自定义菜单实例
Mar 20 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
Python模块的加载讲解
Jan 15 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
使用Python操作MySQL的小技巧
Sep 10 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 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
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php实现无限级分类
2014/12/24 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
php错误日志简单配置方法
2016/07/11 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
python动态文本进度条的实例代码
2020/01/22 Python
python 图像增强算法实现详解
2021/01/24 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
UNIX命令速查表
2012/03/10 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
财务内勤岗位职责
2014/04/17 职场文书
调研汇报材料范文
2014/08/17 职场文书
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
Android实现图片九宫格
2022/06/28 Java/Android