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中的URLError异常的方法
Apr 30 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
TensorFlow模型保存和提取的方法
Mar 08 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
python交易记录整合交易类详解
Jul 03 Python
python滑块验证码的破解实现
Nov 10 Python
python 使用三引号时容易犯的小错误
Oct 21 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
python实现银行账户系统
Feb 22 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开发模式(简写版)
2007/03/15 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
jquery css实现邮箱自动补全
2016/11/14 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python解析nginx日志文件
2015/05/11 Python
Python中is和==的区别详解
2018/11/15 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
Python判断telnet通不通的实例
2019/01/26 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python如何输出整数
2020/06/07 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
手机配件第一品牌:ZAGG
2017/05/28 全球购物
会计大学生职业生涯规划书范文
2014/01/13 职场文书
浙大毕业生自荐信
2014/01/26 职场文书
小学科学教学反思
2014/01/26 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
上课不认真检讨书
2014/09/17 职场文书
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript