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检测远程服务器tcp端口的方法
Mar 14 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
详细分析python3的reduce函数
Dec 05 Python
Python批量发送post请求的实现代码
May 05 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
Python如何实现FTP功能
May 28 Python
python文件排序的方法总结
Sep 13 Python
详解Python魔法方法之描述符类
May 26 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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 字符转义 注意事项
2009/05/27 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
中学生检讨书范文
2014/11/03 职场文书
2014年科室工作总结
2014/11/20 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL