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中as用法实例分析
Apr 30 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
使用Pytorch来拟合函数方式
Jan 14 Python
python lambda函数及三个常用的高阶函数
Feb 05 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
Python中SQLite如何使用
May 27 Python
pycharm 关掉syntax检查操作
Jun 09 Python
python 实现波浪滤镜特效
Dec 02 Python
python数字图像处理:图像简单滤波
Jun 28 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
xml+php动态载入与分页
2006/10/09 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
php字符串过滤与替换小结
2015/01/26 PHP
php实现微信公众号无限群发
2015/10/11 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
layui清除radio的选中状态实例
2019/11/14 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
Python中常用信号signal类型实例
2018/01/25 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
实习教师自我鉴定
2013/09/27 职场文书
成品仓管员岗位职责
2013/12/11 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
交通事故起诉书
2015/05/19 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
Python中Permission denied的解决方案
2021/04/02 Python
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
Python实现简单的猜单词
2021/06/15 Python