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实现的Kmeans++算法实例
Apr 26 Python
python爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
Python中查看文件名和文件路径
Mar 31 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
python 普通克里金(Kriging)法的实现
Dec 19 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 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
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
岗位职责怎么写
2014/03/14 职场文书
高三家长寄语
2014/04/03 职场文书
质量承诺书格式
2014/05/20 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
班主任寄语2016
2015/12/04 职场文书
php修改word的实例方法
2021/11/17 PHP
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server