首页 > 编程语言 >drf : APIView执行流程和新的Request源码。APIView和Request对象分析

drf : APIView执行流程和新的Request源码。APIView和Request对象分析

时间:2024-03-25 10:44:37浏览次数:26  
标签:-- APIView self Request request 源码 csrf view

DRF基本使用及执行流程分析

1. 继承APIView使用

2. APIView的执行流程

路由: path('Book1',view.Book.as_view()) --> 第二个参数是函数的内存地址 --> APIView的as_view的执行结果 
      --> 本质还是用了View类的as_viewn内的viewc包函数,去掉了csrf的认证。
      --> 当请求来了-->触发view的闭包函数执行,并且传入request --> 调用了self.dispatch 
      --> self是视图类的对象,从Book1中的找dispatch,但是找不到 --> 父类APIView中有 --> 本质执行dispatch是APIView类中的
      """APIView的as_view方法只是多了一个去掉csrf功能"""

APIView继承了Django的view


客户端发送请求,假设为get请求,先去类本身找as_view()方法,此时视图类BookAPIView中没有as_view()方法就去继承的APIView类中寻找,APIView中有as_view方法,执行,重写了as_view。
此时中间件无论是否注释,都不会执行。

# csrf的局部禁用-->在视图函数上加装饰器-->csrf_exempt装饰器-->装饰器本质就是一函数
# 装饰器的@ 是一个 语法糖(特殊语法) --> 把紧贴着的函数名当做参数传入装饰器中并且将返回结果赋值给函数名:index=csrf_exempt(index)
@csrf_exempt
def index(request):
  pass

等同于

csrf_exempt(index)

此时要视图类继承APIView类,csrf中间件直接无效。
在执行self.dispatch() ---> APIView的dispatch






在视图类中使用的request对象是新的request对象,老的是request._request,新的request.GET拿到的还是老的GET,原理如下(Request类重写了双下getattr)

可以得出:
	request._request.GET -最初始的request。
        request._request -新request
那么为什么新的request可以与老request执行结果相同。
因为触发了__getattr__魔法方法,何为魔法方法?不需要主动调用,某种状态下会触发。

__getattr__ 对象.属性 会触发并执行
def __getattr__(self, attr):
    """
    If an attribute does not exist on this instance, then we also attempt
    to proxy it to the underlying HttpRequest object.
    """
    
    try:
        return getattr(self._request, attr)
    except AttributeError:
        return self.__getattribute__(attr)

结论: 以后继承了APIView后,request对象成了新的,但是跟原来一样用。

新的request对象中有一个属性 data

data是post请求携带的数据 --- 字典

无论是什么编码格式,只要是post提交的数据,都在request.data中。

代码验证:
没有携带任何数据

新增unlencoded数据,request.POST与request.data都能接收

新增JSON格式数据,request.data

从body中取出,loads反序列化之后,转到request.data中

APIView和Request对象分析

以后如果使用drf,继承APIView(drf提供了很多view,他们都是继承自APIView),执行流程如下

-包装出一个新的request,在视图函数中使用时,跟原来没有区别。

-注意:取post提交的数据,不要从request.POST中取,从request.data中取

-注意:取get提交的数据,不要从request.GET中取,从request.query_params中取

# 将方法包装成数据属性
@property
def query_params(self):
        """
        More semantically correct name for request.GET.
        """
  return self._request.GET

Request类(drf) 中需要掌握的

  • request.data
  • request.query_params
  • request.FIELS

APIView类

  • 包装新的request
  • 执行了认证,权限,频率
  • 处理了全局异常
  • 包装了request对象

标签:--,APIView,self,Request,request,源码,csrf,view
From: https://www.cnblogs.com/HeroZhang/p/18093867

相关文章

  • djangoCIA报价平台的设计与实现(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,互联网已经深入到我们日常生活的方方面面。在众多的应用场景中,报价系统作为商业交易的重要环节,扮演着至关重要的角色。尤其是在CIA(Ce......
  • djangoAndroid共享停车位(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加速,汽车已成为人们日常生活中不可或缺的交通工具。然而,在许多城市中,由于停车位数量有限,停车难成为了一大问题。为了解决这一问题,共享停车......
  • 【附源码】django计算机毕业设计web的诗词信息管理平台(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化时代,诗词作为中华民族传统文化的瑰宝,承载着丰富的历史和文化价值。然而,随着科技的发展和生活节奏的加快,人们对于诗词的接触和传承逐渐减少,尤其......
  • 【附源码】django计算机毕业设计web技术的养老服务平台(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义养老服务平台开发设计背景:随着社会老龄化的加剧,养老问题逐渐成为社会关注的热点。老年人作为社会的重要组成部分,他们的生活质量和幸福感直接关系到社会的和谐与稳定......
  • 【前端素材】推荐优质多用途生活家具购物商城网站设计Glee平台模板(附源码)
    一、需求分析在线生活家具商店网站是指专门销售各类家具和家居用品的网上商店。这类网站提供用户浏览、选择并购买各种家具产品的平台。以下是在线生活家具商店网站的一般功能:产品展示与购买: 网站展示各种家具产品,如沙发、床、桌子、椅子、柜子等,用户可以查看详细信息、图......
  • 学会HashMap源码,一篇就够了
    目录 一.数据结构 1.数组2.链表3.哈希表(1)什么是哈希?(2)哈希算法的特点(3)哈希表(4)什么是哈希冲突?怎么解决(5)HashMap是怎么解决哈希冲突的?4.红黑树(1)什么是树(2)什么是二叉树(3)什么是二叉搜索树(4)二叉搜索树的缺点(5)AVL树(6)红黑树  一. 介绍二.查找操作三.插入操......
  • 【前端素材】推荐优质多用途肉类品商城网站设计Meatza平台模板(附源码)
    一、需求分析多用途肉类品商城网页是一个在线平台,专门销售各种肉类及相关产品的电子商城。以下是这类网页通常具备的具体功能:产品分类:网页会根据不同种类的肉类进行分类,如牛肉、猪肉、禽类、海鲜等,方便用户查找所需产品。产品展示:网页会展示各种肉类产品的图片、价格、产......
  • AMD、request.js,生词太多,傻傻搞不清
    前言之前在公司用JS写前端页面,本来自己是一个写后端的,但是奈何人少,只能自己也去写了。但是自己对前端基本不懂,基本就是照着前人写的照着抄,反正大体意思是明白的,但是出现问题了,基本上也是吭哧吭哧好几天,也能解决,但是由于自己对前端这一套是一点都不懂,导致效率很低,而且经常返工。后......
  • 【附源码】JAVA计算机毕业设计音乐豆瓣(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展,音乐作为人们日常生活中不可或缺的一部分,其获取与分享方式也在不断地变革。传统的音乐获取途径,如购买唱片或到实体音乐店挑选......
  • MyBatis3源码深度解析(二十一)动态SQL实现原理(二)动态SQL解析过程、#{}和${}的区别
    文章目录前言8.5动态SQL解析过程8.5.1SQL配置转换为SqlSource对象8.5.2SqlSource转换为静态SQL语句8.6#{}和${}的区别8.7小结前言在【MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件】中研究了MyBatis动态SQL相关的组件,如SqlSource用于描述......