Django DRF视图

news2024/12/23 23:00:02

文章目录

  • 一、DRF类视图介绍
    • APIView
    • GenericAPIView类
    • ViewSet类
    • ModelViewSet类
      • 重写方法
  • 二、Request与Response
    • Request
    • Response
  • 参考


一、DRF类视图介绍

在DRF框架中提供了众多的通用视图基类与扩展类,以简化视图的编写。
• View:Django默认的视图基类,负责将视图连接到URL,HTTP请求方法的基本调度

• APIView:DRF提供的所有视图的基类,继承View并扩展,具备了身份认证、权限检查、流量控制等功能。

• GenericAPIView:对APIView更高层次的封装,例如增加分页、过滤器

• GenericViewSet:继承GenericAPIView和ViewSet

• ViewSet:继承APIView,并结合router自动映射路由

• ModelViewSet:继承GenericAPIView和五个扩展类,封装好各种请求,更加完善,业务逻辑基本不用自己写了。
在这里插入图片描述

APIView

示例:

class UserView(APIView):
    def get(self, requset, pk=None):
        if pk:
            user_obj = User.objects.get(id=pk)  # 获取单个用户数据
            user_ser = UserSerializer(user_obj)
        else:
            queryset = User.objects.all()  # 获取所有用户
            # 调用序列化器将queryset对象转换为json
            user_ser = UserSerializer(queryset, many=True)  # 如果序列化多条数据,需要指定many=True
        res = {'code': 200, 'msg': '获取用户成功', 'data': user_ser.data}
        return Response(res)  # 从.data属性获取序列化结果

    def post(self, request):
        user_ser = UserSerializer(data=request.data)  # 调用序列化器将传入的数据反序列化,转换为Python对象
        if user_ser.is_valid():  # 验证数据格式是否正确
            user_ser.save()  # 保存数据到数据库
            msg = '创建用户成功'
            code = 200
        else:
            msg = '数据格式不正确'
            code = 400
        res = {'code': code, 'msg': msg}
        return Response(res)

GenericAPIView类

GenericAPIView对APIView更高层次的封装,实现以下功能:

• 增加queryset属性,指定操作的数据,不用再将数据传给序列化器,会自动实现。
• 增加serializer_class属性,直接指定使用的序列化器
• 增加过滤器属性:filter_backends
• 增加分页属性:pagination_class
• 增加lookup_field属性和实现get_object()方法:用于获取单条数据,可自定义默认分组名(pk)

示例:
在这里插入图片描述

ViewSet类

GenericAPIView已经完成了许多功能,但会有一个问题,获取所有用户列表和单个用户需要分别定义两个视图和URL路由,使用ViewSet可以很好解决这个问题,并且实现了路由自动映射

ViewSet视图集不再实现get()、post()等方法,而是实现以下请求方法动作:

• list():获取所有数据
• retrieve():获取单个数据
• create():创建数据
• update():更新数据
• destory():删除数据

示例:
在这里插入图片描述
自定义路由:
在路由这块定义与之前方式一样,每个API接口都要写一条URL路由,但实际上我们用ViewSet后,就不用自己设计URL路由及绑定HTTP方法了,会自动处理URL路由映射
在这里插入图片描述

ModelViewSet类

ModelViewSet继承GenericAPIView和五个扩展类,封装好各种请求,更加完善,业务逻辑基本不用自己写了,只需要指定serializer_class和queryset,就可以直接进行增删改查

class UserViewSet(ModelViewSet):
    queryset = User.objects.all()       # 指定操作的数据
    serializer_class = UserSerializer   # 指定序列化器

在这里插入图片描述

重写方法

由于ModelViewSet有较高的抽象,实现自动增删改查功能。对于增、改在很多场景无法满足需求,这就需要重写对应方法了。

示例:重写create()方法,修改数据和响应内容格式
在这里插入图片描述

二、Request与Response

Request

DRF传入视图的request对象不再是Django默认的HttpRequest对象,而是基于HttpRequest类扩展后的Request类的对象。

Request对象的数据是自动根据前端发送的数据统一解析数据格式

常用属性:
• request.data:返回POST提交的数据,与request.POST类似
• request.query_params:返回GET URL参数,与request.GET类似

Response

DRF提供了一个响应类Reponse,响应的数据会自动转换符合前端的JSON数据格式。

导入:
from rest_framework.response import Response

格式:
Response(data, status=None, template_name=None, headers=None, content_type=None)
• data:响应序列化处理后的数据,传递python对象
• status:状态码,默认200
• template_name:模板名称
• headers:用于响应头信息的字典
• content_type:响应数据的类型

使用方法:return Reponse(data=data, status=status.HTTP_404_NOT_FOUND)

为了方便设置状态码,rest_framework.status模块提供了所有HTTP状态码,以下是一些常用的:

• HTTP_200_OK:请求成功
• HTTP_301_MOVED_PERMANENTLY:永久重定向
• HTTP_302_FOUND:临时重定向
• HTTP_304_NOT_MODIFIED:请求的资源未修改
• HTTP_403_FORBIDDEN:没有权限访问
• HTTP_404_NOT_FOUND:页面没有发现
• HTTP_500_INTERNAL_SERVER_ERROR:服务器内部错误
• HTTP_502_BAD_GATEWAY:网关错误
• HTTP_503_SERVICE_UNAVAILABLE:服务器不可达
• HTTP_504_GATEWAY_TIMEOUT:网关超时

参考

https://www.aliangedu.cn/course/learn?cid=20&sid=10&pid=2197

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

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

相关文章

数据结构堆

前言: 在前面我们已经学习了数据结构的基础操作:顺序表和链表及其相关内容,今天我们来学一点有些难度的知识——数据结构中的二叉树,今天我们先来学习二叉树中堆的知识,这部分内容还是非常有意思的,下面我们…

设计模式学习笔记 - 设计模式与范式 -行为型:2.观察者模式(下):实现一个异步非阻塞的EventBus框架

概述 《1.观察者模式(上)》我们学习了观察者模式的原理、实现、应用场景,重点节介绍了不同应用场景下,几种不同的实现方式,包括:同步阻塞、异步非阻塞、进程内、进程间的实现方式。 同步阻塞最经典的实现…

【 书生·浦语大模型实战营】学习笔记(一):全链路开源体系介绍

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、…

【Linux】TCP网络套接字编程+守护进程

文章目录 日志类(完成TCP/UDP套接字常见连接过程中的日志打印)单进程版本的服务器客户端通信多进程版本和多线程版本守护进程化的多线程服务器 日志类(完成TCP/UDP套接字常见连接过程中的日志打印) 为了让我们的代码更规范化&…

鸿蒙实战开发-如何使用声明式UI编程框架的基础组件

介绍 在本教程中,我们将通过一个简单的样例,学习如何使用声明式UI编程框架的基础组件。本篇Codelab将会使用Image组件、Slider组件、Text组件共同实现一个可调节的风车动画,实现效果如图所示 相关概念 Text组件:文本组件&#x…

9.Python类与对象

1 面向对象 类和对象都是面向对象中的重要概念。面向对象是一种编程思想, 即按照真实世界的思维方式构建软件系统。 例如,在真实世界的校园里有学生和老师,学生有学号、姓名、所 在班级等属性(数据),还有…

MAC的Safari浏览器没有声音解决办法

有一段时间没打开电脑,也不知道是系统自动更新或是什么缘故,所有浏览器都无法正常发声。 现象如下: 首先,Safari浏览器无法自动播放声音,下载的360浏览器现象一致,但是播放其他音乐播放软件和视频软件都正…

Java 面试宝典:请说下你对 Netty 中Reactor 模式的理解

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站:https://skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 回答 Reactor 模式是一种高效处理并发网络事件的设计模式&…

新手使用GIT上传本地项目到Github(个人笔记)

亲测下面的文章很有用处。 1. 初次使用git上传代码到github远程仓库 - 知乎 (zhihu.com) 2. 使用Git时出现refusing to merge unrelated histories的解决办法 - 知乎

五、Yocto集成QT5(基于Raspberrypi 4B)

Yocto集成QT5 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第五篇文章: 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi 4B) 三、Yocto创建自定义的layer和image 四、Yocto创建静态IP和VLAN 本章节实操代码请查看github仓库&…

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径,把default.yaml复制放到相应的路径下。(缺少相应…

Linux的开发工具(二):编译器gcc/g++与Linux项目自动化构建工具-Makefile

Linux的编译器-gcc/g 基本概念:gcc是专门用来编译c语言的,g可以编译c或c语言 问题一:gcc有时候为什么不能编译带有for循环的c语言源文件? 答:gcc版本过低会不支持for循环等c99标准下的内容 解决方式:gcc…

Spring定义Bean对象笔记

前言:面向对象语言最基本的元素就是对象,在Spring中把对象都封装为一个个的Bean,即通过Bean容器来管理对象;那么接下来我们看下在Spring中如何创建所需要的Bean。 一、环境准备 员工类 package com.xlb.bean;public class Empl…

在 C#和ASP.NET Core中创建 gRPC 客户端和服务器

关于gRPC和Google protobuf gRPC 是一种可以跨语言运行的现代高性能远程过程调用 (RPC) 框架。gRPC 实际上已经成为 RPC 框架的行业标准,Google 内外的组织都在使用它来从微服务到计算的“最后一英里”(移动、网络和物联网)的强大用例。 gRP…

数据结构——二叉树——堆

前言: 在前面我们已经学习了数据结构的基础操作:顺序表和链表及其相关内容,今天我们来学一点有些难度的知识——数据结构中的二叉树,今天我们先来学习二叉树中堆的知识,这部分内容还是非常有意思的,下面我们…

重读 Java 设计模式: 深入探讨原型模式,灵活复制对象

引言 在软件开发中,经常会遇到需要创建对象的情况。有时候,我们希望创建一个新的对象,但又不想通过传统的构造方法来创建,而是希望通过复制一个现有对象的方式来创建新的对象。这时,原型模式就能派上用场了。原型模式…

【51单片机入门记录】A2普中开发板实验课例程

一、开发板原理图 二、例程 &#xff08;1&#xff09;呼吸灯 #include <STC89C5xRC.H> #include<intrins.h>unsigned int PWM_wanttime0; //想要多长时间改变的占空比一次 unsigned int Breath_wanttime0; //想要多长时间改变呼气或者吸气的值时间 unsigned …

Android Studio 新建aar包

有几个注意事项 第一是注意是选择Android library这个包注意moudle name不能包含apk这三个字符

动手学机器学习双线性模型+习题

在数学中&#xff0c;双线性的含义为&#xff0c;二元函数固定任意一个自变量时&#xff0c;函数关于另一个自变量线性 矩阵分解 设想有N个用户和M部电影&#xff0c;构建一个用户画像库&#xff0c;包含每个用户更偏好哪些类型的特征&#xff0c;以及偏好的程度。假设特征的个…

0.5米多光谱卫星影像在农业中进行地物非粮化、非农化监测

一、引言 随着科技的发展&#xff0c;卫星遥感技术已经成为了农业领域中重要的数据来源。其中&#xff0c;多光谱卫星影像以其独特的优势&#xff0c;在农业应用中发挥着越来越重要的作用。本文将重点探讨0.5米加2米多光谱卫星影像在农业中的应用。 二、多光谱卫星影像概述 多…