Django DRF视图
文章目录
- 一、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对象转换为jsonuser_ser = UserSerializer(queryset, many=True) # 如果序列化多条数据,需要指定many=Trueres = {'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 = 200else:msg = '数据格式不正确'code = 400res = {'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
相关文章:
Django DRF视图
文章目录 一、DRF类视图介绍APIViewGenericAPIView类ViewSet类ModelViewSet类重写方法 二、Request与ResponseRequestResponse 参考 一、DRF类视图介绍 在DRF框架中提供了众多的通用视图基类与扩展类,以简化视图的编写。 • View:Django默认的视图基类&…...
SQLite全文搜索引擎:实现原理、应用实践和版本差异
文章目录 一、实现原理1.1 倒排索引1.2 虚拟表 二、应用在工程上的实施方法2.1 创建FTS虚拟表2.2 插入数据2.3 全文搜索2.4 关联普通表2.5 更新和删除数据2.6 优化FTS虚拟表2.7 小结 三、FTS3、FTS4和FTS5的区别3.1 FTS33.2 FTS43.3 FTS53.4 小结 四、更新SQLite的FTS版本的步骤…...
day17-二叉树part04
110.平衡二叉树 (优先掌握递归)后序遍历 左右中 class Solution {public boolean isBalanced(TreeNode root) {return getHeight(root) ! -1;}//递归三部曲 确定方法的参数与返回值private int getHeight(TreeNode root){//明确终止条件if(root null){r…...
书生浦语第一次课
模型的发展 从专业模型到通用模型 书生浦语大模型全链路开源体系 2023.06.07 -> InternLM千亿参数语言大模型发布 2023.07.06 -> InternLM千亿参数语言大模型全面升级,支持8K语境、26种语言。全面开源、免费商用:InternLM-7B、全链条开源工具…...
UE小:UE5.3无法创建C++工程
当您在使用Unreal Engine (UE) 构建项目时,如果遇到以下问题: Running C:/Program Files/Epic Games/UE\_5.3/Engine/Build/BatchFiles/Build.bat -projectfiles -project"C:/UEProject/Shp\_1/Shp\_1.uproject" -game -rocket -progress Usi…...
FFmpeg获取视频详情
话不多说,直接上代码: pom依赖: <!--视频多媒体工具包 包含 FFmpeg、OpenCV--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.3</versi…...
find: paths must precede expression
find: paths must precede expression 1. find: paths must precede expression2. 请在搜索字符串上添加单引号或者双引号References 1. find: paths must precede expression strongforeverstrong:~/ForeverStrong$ find /home/strong/ForeverStrong/image_results/ -name *.…...
RabbitMQ3.x之九_Docker中安装RabbitMQ
RabbitMQ3.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # latest Rabb…...
vue快速入门(四)v-html
注释很详细,直接上代码 上一篇 新增内容 使用v-html将文本以html的方式显示 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …...
第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟
第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><met…...
C++ 2024-4-1 作业
#include <iostream> using namespace std;class A { public:int a;A(int a):a(a){cout<<"A的有参构造"<<endl;} }; class B:virtual public A { public:int b;B(int a,int b):A(a),b(b){cout<<"B的有参构造"<<endl;} }; cl…...
【滑动窗口】Leetcode 串联所有单词的子串
题目解析 30. 串联所有单词的子串 本题的意思就是在目标串s中寻找能够找到的words字符串的全排列,返回起始位置 算法讲解 我们可以将这道题转化为寻找目标串的words字母的异位词,按照上一次讲解的【滑动窗口】Leetcode 找到字符串中所有字母异位词我们…...
golang channel实践代码及注意事项
在使用Go语言(Golang)的通道(Channel)时,有几个重要的注意点可以帮助开发者更安全、高效地使用它们进行并发编程。以下是一些关键的注意事项: 选择正确的通道类型:Go语言提供了两种类型的通道&…...
面试题:RabbitMQ 消息队列中间件
1. 确保消息不丢失 生产者确认机制 确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据持久化功能 确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化消费者确认机制 由spring确认消息处理成功后…...
wpf中引用自定义字体
在WPF(Windows Presentation Foundation)中,FontFamily属性用于指定控件或文本元素使用的字体。它是一个非常基础且重要的属性,影响着用户界面的视觉呈现和可读性。以下是关于WPF中FontFamily属性的一些关键信息和使用方法&#x…...
高效准确!指甲剪盖片视觉检测技术解密
指甲剪的盖片是指指甲剪的一端,通常用来盖住另一端的刀刃部分。指甲剪盖片是指甲剪的重要部分,除了保护刀刃外,还起到美观和便捷的作用。正确使用和保养指甲剪盖片可以延长指甲剪的使用寿命。 本案是对指甲剪盖片最大尺寸长75mm*宽10mm*高3mm…...
分布式IO模块PLC扩展模拟量模块
BL200是一款结构紧凑、体积小的分布式IO耦合器,支持ModbusTCP协议,采用嵌入式硬件,主频380Mhz,基于LinuxOS,采用独特的MAC层数据交换技术的双网口技术实现级联,中间设备宕机不影响后面设备的数据传输,可支持高达32个AI、DI、DO、热电阻、热电偶、RS485等种类的IO板,广泛应用于工…...
Qt事件系统
第三章Qt事件系统 文章目录 第三章Qt事件系统1.事件系统事件是如何传递的事件类型事件处理发送事件 2.事件传播机制事件接受和忽略事件分发事件过滤 3.事件和信号的区别 1.事件系统 在Qt中,事件是派生抽象QEvent类的对象,它表示应用程序内发生的事情&am…...
C++STL--排序算法
sort 使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。 sort(v.begin(),v.end());//对v容器进行排序,默认升序 sort(v.begin(),v.end(),greater<int>());//降序排序对于支持随机访问的迭代器的容器, 都可以利用sort算法直接对其进行排序…...
CEF的了解
(14 封私信 / 80 条消息) CEF和Electron的区别是什么? - 知乎 (zhihu.com) Electron面向的开发者:会用JavaScript,HTML,CSS,不会C CEF面向的开发者:会用JavaScript,HTML,CSS,会C (14 封私信 / 80 条消息) liulun - …...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
