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实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
Python数据可视化正态分布简单分析及实现代码
Dec 04 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
Flask-WTF表单的使用方法
Jul 12 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
python实现批处理文件
Jul 28 Python
Python configparser模块应用过程解析
Aug 14 Python
Python类型转换的魔术方法详解
Dec 23 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中new static()与new self()的比较
2016/08/19 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
js 操作符汇总
2014/11/08 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
详解jQuery选择器
2016/12/21 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
pyside写ui界面入门示例
2014/01/22 Python
django中静态文件配置static的方法
2018/05/20 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
工程概预算专业毕业生求职信
2013/10/04 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
团购业务员岗位职责
2014/03/15 职场文书
年会搞笑主持词
2014/03/27 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
中学生逃课检讨书
2015/02/17 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang