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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
Aug 02 Python
python实现二分类的卡方分箱示例
Nov 22 Python
Python hashlib常见摘要算法详解
Jan 13 Python
解决ROC曲线画出来只有一个点的问题
Feb 28 Python
python如何爬取网页中的文字
Jul 28 Python
如何查看python关键字
Jan 17 Python
Python爬虫基础讲解之请求
May 13 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 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入门经历和学习过程分享
2014/04/11 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
PHP中list方法用法示例
2016/12/01 PHP
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
2019/12/22 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
python判断字符串是否包含子字符串的方法
2015/03/24 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python接口测试文件上传实例解析
2020/05/22 Python
python定义类的简单用法
2020/07/24 Python
python 模拟登陆github的示例
2020/12/04 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
党支部组织生活会整改方案
2014/09/30 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
初中班主任心得体会
2016/01/07 职场文书
医学会议开幕词
2016/03/03 职场文书
python 爬取天气网卫星图片
2021/06/07 Python