DRF APIView源码分析

【三】APIView源码分析

【1】Response和JsonResponse的区别

(1)Django REST framework的Response

  • DRF的Response类是专门为构建RESTful API设计的。

  • 它不仅仅是一个简单的JSON响应,而是包含了一系列与RESTful API交互有关的功能。

    • 内容类型协商:DRF的Response类能够自动处理内容类型协商,根据客户端的请求头(如Accept)来返回适当的媒体类型。

    • 渲染器:DRF提供了多种渲染器,可以将响应数据渲染为不同的格式(如JSON、XML等)。Response类会根据请求的内容类型选择适当的渲染器。

    • 状态码:DRF的Response类可以轻松设置HTTP状态码,以表示API请求的成功或失败。

    • 头信息:可以使用Response类来设置HTTP响应的头信息。

    • 数据序列化:DRF的序列化器与Response类紧密集成,使得从数据库模型到JSON响应的转换变得简单。

(2)Django的JsonResponse

  • Django的JsonResponse是一个简单的类,用于返回JSON格式的HTTP响应。

  • 它主要用于那些不需要DRF复杂功能的简单场景。

    • 仅支持JSONJsonResponse仅支持返回JSON格式的响应,不像DRF的Response类那样支持多种媒体类型。

    • 状态码和头信息:也可以使用JsonResponse来设置HTTP状态码和头信息,但其功能相对有限。

    • 数据:将Python对象传递给JsonResponse,它会自动将其转换为JSON格式。

image-20240412194413961

【2】简单使用APIView

  • 视图层
    • 这个基于APIView编写的CBV视图和基于View的CBV视图目前来看是没有区别的
from rest_framework.views import APIView
from book.models import Book
from rest_framework.response import Response
from django.forms.models import model_to_dictclass BookAPIView(APIView):def get(self, request, *args, **kwargs):book_queryset = Book.objects.all()results = [model_to_dict(info_fict) for info_fict in book_queryset]return Response({'code': 100, 'msg': '查询成功', 'results': results})
  • 补充:model_to_dict:这个方法可以快速将模型表的obj转换成dict

【3】APIView源码解析

(0)知识点复习

  • 语法糖
    • 详情请见:Python 闭包函数和装饰器_python 闭函数-CSDN博客
  • 这两种写法都是一样的效果,在index方法上加了csrf_exempt装饰器,取消了验证
@csrf_exempt
def index(request):passindex=csrf_exempt(index)    

(1)首先确定继承关系

  1. 自定义了BookAPIView的视图函数
  2. BookAPIView的视图函数继承了drf的APIView
  3. 通过看源码,发现APIView继承了View
  4. 那么这个View是Django的CBV视图中的View吗?
    • 是的,打印一下这两个View,可以发现是一个View
    • 所以继承APIView后任可以按照普通的View书写
from rest_framework.views import APIView
from django.views import View
print(issubclass(APIView, View))  # True
  • 所以继承关系为:
    • BookAPIView --> APIView --> View
    • 所以源码的分析中无论是属性还是方法,都是按照这个继承顺序来查找

(2)重点部分分析

  1. 首先通过路由层的路由匹配,找到视图函数并执行
    • 这里将执行TBookAPIView.as_view()(request)这个方法
    • 自动加括号并将参数request参数传递进去
  2. 查找as_view方法
    • 根据之前确定的继承关系,知道了查找顺序,首先去TBookAPIView中找,显然是没有的
    • 然后去APIView中找,很快就找到了,但是他又执行了super().as_view(**initkwargs)
    • 所以最终去View中找,之前分析CBV源码的时候已经知道了
    • 这里提前说一下最后的结果,csrf_exempt(view),这个用csrf_exempt装饰器,只不过没有用语法糖装饰
    • 所以基于APIView书写的CBV是没有csrf验证的
  3. 执行View的as_views方法
    • 这里是一个闭包函数,所以到这里的将执行的内容为,在返回的view后面加上括号和request参数view(request, *args, **kwargs),接下来执行dispath方法,又开始寻找这个方法了
    • 首先去TBookAPIView中找,显然是没有的
    • 然后去APIView中找,很快就找到了,所以接下来执行APIViewdispatch方法
  4. 执行APIViewdispatch方法
    • 首先执行了initialize_request方法,同理去找这个方法,最终在APIView的中找到
    • 执行initialize_request方法
      • 这里不做过多叙述,后面会详细讲解
      • 简单来说就是在Django的request的外面包装了一层,将原本的request方法保留,并在其方法上加了一些其他很好用的方法和属性
    • 接下来执行initial方法,同理有要按照顺序去找这个方法,最终还是在APIView的中找到
      • 这个方法内部一次执行了用户、权限、频率的验证,这里目前也不做过多赘述
  5. 最后和View的处理方法一样
    • 这里执行了反射方法getattr
    • handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
      • 第一个参数self还是TaskView的实例
      • 第二个参数是当前请求方式的小写方法,这个例子中是get字符串
      • 第三个参数就是没有找到将会返回的数据,这个不是重点不用管
    • 通过反射就拿到了我们定义在TaskView的实例中的get方法,执行get方法即可,get(self, request, *args, **kwargs)

image-20240412212643352

(3)APIView小结

  • APIView不用csrf验证了
  • APIView的request方法不在是以前的request方法,有了很多好用的新方法
  • APIView内部还分别进行了了用户、权限、频率的验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/625273.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568 学习笔记 : 更改 u-boot spl 中的 emmc 的启动次序

环境 开发板: 【正点原子】 的 RK3568 开发板 ATK-DLRK3568 u-boot 版本:来自 【正点原子】 的 RK3568 开发板 Linux SDK,单独复制出来一份,手动编译 编译环境:VMware 虚拟机 ubuntu 20.04 问题描述 RK3568 默认 …

C++笔记:类和对象

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量,类型就像是定义了数据的规则,而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型,而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

【数据结构与算法】用两个栈实现一个队列

题目 用两个栈,实现一个队列功能 add delete length 队列 用数组可以实现队列,数组和队列的区别是:队列是逻辑结构是一个抽象模型,简单地可以用数组、链表实现,所以数组和链表是一个物理结构,队列是一个逻…

Servlet-Filter实现反爬虫

以前用DotNetCore实现过反爬虫功能。在tomcat里面可以利用Servlet的Filter类实现请求的控制来达到反爬虫功能,进而增强JRT的web安全。 实现黑名单过滤器,对在黑名单列表的IP的所有请求都跳转到警告页面,业务各种请求自行定义加入黑名单 /* …

爆肝3k字!掌握Spring与Redis的高效交互:从Jedis到Spring Data Redis

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

数字孪生技术的应用场景

数字孪生技术是一种新兴技术,具有广阔的应用前景。目前,数字孪生技术已经在以下几个领域得到了广泛应用。数字孪生技术是一种具有革命性的技术,它将深刻改变我们的生活和工作方式。随着数字孪生技术的不断发展,我们可以期待在未来…

Javascript中的this关键字指向,2024年最新阿里前端开发面试解答

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞…

【C++】适配器· 优先级队列 仿函数 反向迭代器

目录 适配器:适配器的应用:1. 优先级队列:仿函数:更深入的了解仿函数:一个关于不容易被注意的知识点: 2. 反向迭代器:(list为例) 适配器: 我们先来谈来一下容…

设计模式——2_9 模版方法(Template Method)

人们往往把任性也叫做自由,但是任性只是非理性的自由,人性的选择和自决都不是出于意志的理性,而是出于偶然的动机以及这种动机对感性外在世界的依赖 ——黑格尔 文章目录 定义图纸一个例子:从文件中获取信息分几步?Rea…

Adobe AE(After Effects)2017下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件,由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能,可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

MapReduce 机理

1.hadoop 平台进程 Namenode进程: 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是Namespace 镜像文件(Namespace image)和操作日志文件(edit log)&#xff…

vscode编译c++报错解决方案

1,xxxx cl.exe 一大串什么非程序员的(应该是这些),就是看一些谁的,调用了Visual Studio的编译软件去运行。建议,不要这样搞。 解决方案1:每次用就看这个文章(个人觉得很麻烦):仅当…