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://xiahunao.cn/news/2960329.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

使用go和消息队列优化投票功能

文章目录 1、优化方案与主要实现代码1.1、原系统的技术架构1.2、新系统的技术架构1.3、查看和投票接口实现1.4、数据入库MySQL协程实现1.5、路由配置1.6、启动程序入口实现 2、压测结果2.1、设置Jmeter线程组2.2、Jmeter聚合报告结果,支持11240/秒吞吐量2.3、Jmeter…

用于半监督的图扩散网络 笔记

1 Title Graph Neural Diffusion Networks for Semi-supervised Learning(Wei Ye, Zexi Huang, Yunqi Hong, and Ambuj Singh)【2022】 2 Conclusion This paper proposes a new graph neural network called GND-Nets (for Graph Neural Diffu…

【日常记录】【CSS】利用动画延迟实现复杂动画

文章目录 1、介绍2、原理3、代码4、参考链接 1、介绍 对于这个效果而言,最先想到的就是 监听滑块的input事件来做一些操作 ,但是会发现,对于某一个节点的时候,这个样式操作起来比较麻烦 只看这个代码的话,发现他用的是动画&#x…

异地组网如何安装?

【天联】是一款强大的异地组网安装工具,可以帮助企业实现远程设备的统一管理和协同办公。以下是【天联】可以应用的一些场景: 零售、收银软件应用统一管理:【天联】可以结合医药、餐饮、商超等零售业的收银软件,实现异地统一管理。…

嵌入式4-16

tftpd #include <myhead.h> #define SER_IP "192.168.125.243" //服务器IP地址 #define SER_PORT 69 //服务器端口号 #define CLI_IP "192.168.125.244" //客户端IP地址 #define CLI_PORT 8889 //客户端端…

C# 超高速高性能写日志

1、需求 需求很简单,就是在C#开发中高速写日志。比如在高并发,高流量的地方需要写日志。我们知道程序在操作磁盘时是比较耗时的,所以我们把日志写到磁盘上会有一定的时间耗在上面,这些并不是我们想看到的。 2、解决方案 2.1、简单原理说明 使用列队先缓存到内存,然后我…

初步学习node.js文件模块

环境已安装好&#xff1b; 写一个read1.js如下&#xff1b; var fs require("fs"); var data ;// 创建一个流 var stream1 fs.createReadStream(test1.jsp); stream1.setEncoding(UTF8);// 绑定data事件 stream1.on(data, function(mydata) {data mydata; });/…

openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置

文章目录 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置264.1 恢复BIOS出厂设置264.2 修改相关BIOS设置264.3 重启操作系统 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置 本章节主要介绍openGauss数据库内核基于鲲鹏服务…

25 vs code配置

1.中文语言 搜索chinese&#xff0c;安装&#xff0c;等待重新打开 2.remote ssh 安装后F1打开&#xff0c;输入adduser 输入ssh [用户名][主机ip]&#xff0c;添加主机&#xff0c;然后选择保存配置文件 如果出现管道不存在&#xff0c;设置一下 如果出问题&#xff0c;也…

IAR 使用笔记(IAR BIN大小为0异常解决)

烧写 由于芯片的内部SPI FLASH的0级BOOT 程序起到到开启JTAG SW 仿真功能&#xff0c;一旦内部SPI FLASH存储的BL0启动代码被损坏&#xff0c;芯片的JTAG 将不能被连接。所以对BL0的烧写需要谨慎&#xff0c;烧写BL0过程保证芯片不断电。 如果烧写了多备份的启动代码&#xff…

WebRTC直播间搭建记录

考虑到后续增加平台直播的可能性&#xff0c;笔记记录一下WebRTC相关. 让我们分别分析两种情况下的WebRTC连接建立过程&#xff1a; 情况一&#xff1a;AB之间可以直接通信 1.信令交换&#xff1a; 设备A和设备B首先通过信令服务器交换SDP&#xff08;Session Description Pr…

【数据结构(七)】二叉树

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构的知识 目录 1.前言2.树形结构2.1树的概念2.2常见概念2.3树的表示形式 3.二叉树3.1概念3…

嵌入式学习55-ARM4(ADC和I²C)

1、什么是ADC,模拟量和数字量有什么特点&#xff1f; ADC&#xff1a; …

每日两题 / 15. 三数之和 73. 矩阵置零(LeetCode热题100)

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 先确定一个数t&#xff0c;对于剩下的两个数&#xff0c;要求两数之和为t的负数 三数之和就退化成了两数之和&#xff0c;两数之和可以用双指针 先排序&#xff0c;左右两个指针&#xff0c;指向的数之和大于目标值&…

鸿蒙入门02-首次安装和配置

注&#xff1a;还没有安装编辑器&#xff08; deveco studio &#xff09;的小伙伴请看鸿蒙入门01-下载和安装-CSDN博客 首次安装配置 编辑器&#xff08; deveco studio &#xff09;安装完毕以后需要进入配置界面进行相关配置配置完毕以后才可以正常使用 环境配置&#xf…

Unity 左右折叠显示与隐藏UI的简单实现

要实现一个简单的UI左右折叠显示与隐藏&#xff0c;可以结合遮罩&#xff0c;通过代码控制UI区块的宽度和位移来实现。 具体可以按以下步骤实现&#xff1a; 1、新建一个Image组件&#xff0c;并添加精灵&#xff0c;调整大小后&#xff0c;复制一份作为该UI的父物体&#xf…

顺序表(快速上手数据结构)

在介绍ArrayList之前, 我们需要先了解List. List是一个接口,它继承于Collection接口(Collection又继承于最顶层的接口Iterable). 从数据结构的角度来看,List就是一个线性表(Linear List),即n个具有相同类型元素的有限序列, 在该序列上可以执行增删查改等操作. 注意: List是一…

Golang面试题四(GMP)

目录 1.Goroutine 定义 2.GMP 指的是什么 3.GMP模型的简介 全局队列&#xff08;Global Queue&#xff09; P的本地队列 P列表 M列表 4.有关P和M的个数问题 P的数量问题 M的数量问题 P和M何时会被创建 5.调度器P的设计策略 复⽤线程 work stealing机制 hand off…

【linux】mobaterm如何kill pycharm进程

【linux】mobaterm如何kill pycharm进程 【先赞后看养成习惯】求点赞关注收藏&#x1f600; 使用云服务器时&#xff0c;pycharm在打开状态下&#xff0c;不小心关了mobaxterm&#xff0c;然后再输入pycharm.sh就会打不开pycharm&#xff0c;显示已经打开报错&#xff1a;Com…

PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

一、实现逻辑 本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的.exe,如果有,下载最新的.exe安装升级。 本实例服务端待下载.exe所在目录结构 本实例客户端待更新.exe所在目录结构 二、搭建服务器 可以参考…