【Django】Django Class-Based Views (CBV) 与 DRF APIView 的区别解析

Django Class-Based Views (CBV) 与 DRF APIView 的区别解析

在 Django 开发中,基于类的视图(Class-Based Views, CBV)是实现可重用性和代码结构化的利器。而 Django REST Framework (DRF) 提供的 APIView 是针对 API 开发的扩展。


一、CBV 视图解析
class BookView(View):
    def get(self, request):
        return HttpResponse("View GET请求...")

    def post(self, request):
        return HttpResponse("View POST请求...")

    def delete(self, request):
        return HttpResponse("View DELETE请求...")

BookView 继承自 Django 提供的 View 类,它定义了三个常见的 HTTP 方法(GET、POST 和 DELETE)。这里的 View 类是一个基类,用来处理请求方法的分发。

1. View 类中的 as_view
class View:
    def as_view(cls):
        def view(request, *args, **kwargs):
            self = cls()  # 实例化 BookView 类
            return self.dispatch(request, *args, **kwargs)
        return view
  • as_view 方法返回一个闭包函数 view,当有请求进来时,view 函数会被调用。
  • view 内部实例化视图类 BookView(),然后调用 dispatch 方法进行请求处理。
2. dispatch 方法
def dispatch(self, request, *args, **kwargs):
    handler = getattr(self, request.method.lower())  # 获取对应的处理方法,如 get/post
    return handler(request, *args, **kwargs)
  • dispatch 方法根据请求的 HTTP 方法(如 GET、POST 等),通过 getattr 动态调用对应的方法。
  • 如果是 GET 请求,它会调用 self.get();如果是 POST 请求,则调用 self.post(),以此类推。
3. 路由绑定
path("book/", views.BookView.as_view())

通过 as_view() 将类视图转换为可调用的视图函数,进而绑定到特定的 URL 路径。


二、DRF 中的 APIView 解析

DRF 提供的 APIView 是 CBV 的增强版,专门用于构建 API。它继承并扩展了 Django 的 View 类,增加了认证、权限和限流机制。

from rest_framework.views import APIView

class BookView(APIView):
    def get(self, request):
        return HttpResponse("APIView GET请求...")

    def post(self, request):
        return HttpResponse("APIView POST请求...")

    def delete(self, request):
        return HttpResponse("APIView DELETE请求...")
1. APIView 中的 as_view
class APIView:
    def as_view(cls):
        view = super().as_view()  # 调用父类 View 的 as_view 方法
        return view
  • APIView 重写了 as_view,但它仍然调用了 super().as_view(),也就是继承了 View 类中的逻辑。
  • 这意味着请求首先会经过 View 的分发机制。
2. dispatch 方法的增强
def dispatch(self, request, *args, **kwargs):
    request = self.initialize_request(request, *args, **kwargs)  # 初始化新的 request 对象
    self.request = request
    
    # 初始化:认证、权限、限流组件
    self.initial(request, *args, **kwargs)
    
    handler = getattr(self, request.method.lower())  # 获取对应的处理方法
    return handler(request, *args, **kwargs)
  • dispatch 方法做了更多的工作。除了请求方法的分发,还包括对请求对象的初始化(initialize_request),以及认证、权限和限流(initial)的处理。
  • 这些增强使 APIView 非常适合用于 API 开发,因为它考虑到了 API 常见的安全和性能需求。
3. 认证、权限、限流

APIView 会自动调用 DRF 的认证、权限和限流组件:

  • 认证self.initial 方法会触发 authentication_classes 中定义的认证机制。
  • 权限:同理,它会检查 permission_classes 中定义的权限控制。
  • 限流:则通过 throttle_classes 实现。

三、对比总结
特性Django View (CBV)DRF APIView
请求分发通过 dispatch 分发到 getpost 等方法继承自 View,同时增加了请求对象的初始化
请求处理只负责 HTTP 方法的处理增加了认证、权限、限流机制
适用场景适用于通用的 Web 开发适用于 API 开发,安全机制健全
使用场景分析
  • CBV 适合传统的 Web 应用开发,尤其是以模板渲染为主的场景。
  • APIView 则更适合 RESTful API 开发,它内置了很多用于处理 API 请求的功能,比如认证和限流,使得开发者能更专注于业务逻辑,而不必重复造轮子。

通过对 CBV 和 APIView 的对比分析,我们可以发现它们的核心逻辑相似,但在实际使用中,APIView 具有更多的扩展能力,尤其是对于 API 开发,DRF 的设计让开发者能更好地应对复杂的需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java汽车销售管理

技术架构: springboot mybatis Mysql5.7 vue2 npm node 有需要该项目的小伙伴可以添加我Q:598748873,备注:CSDN 功能描述: 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&…

基于是springboot小区物业管理系统

小区物业管理系统 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于小区物业管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了小区物业管理系统&#x…

Flutter之SystemChrome全局设置

一、简介 SystemChrome作为一个全局属性,很像 Android 的 Application,功能很强大。 二、使用详解 2.1 setPreferredOrientations 设置屏幕方向 在我们日常应用中可能会需要设置横竖屏或锁定单方向屏幕等不同要求,通过 setPreferredOrien…

人工智能GPT____豆包使用的一些初步探索步骤 体验不一样的工作

豆包工具是我使用比较频繁的一款软件,其集合了很多功能。对话 图像 AI搜索 伴读等等使用都非常不错。电脑端安装集合了很多功能。 官网直达:豆包 使用我的文案创作能力,您可以注意以下几个技巧: 明确需求: 尽可能具…

PointNet++改进策略 :模块改进 | EdgeConv | DGCNN, 动态图卷积在3d任务上应用

目录 介绍核心思想及其实现核心思想实现步骤 如何改进PointNet**局部几何结构的处理****动态图的引入****特征聚合的灵活性****全局和局部特征的结合** 论文题目:Dynamic Graph CNN for Learning on Point Clouds发布期刊:TOG作者单位:麻省理…

[全网首发]怎么让国行版iPhone使用苹果Apple Intelligence

全文共分为两个部分:第一让苹果手机接入AI,第二是让苹果手机接入ChatGPT 4o功能。 一、国行版iPhone开通 Apple Intelligence教程 打破限制:让国行版苹果手机也能接入AI 此次发布会上,虽然国行 iPhone16 系列不支持 GPT-4o&…

C++:二叉搜索树

1.二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树: 若它的左子树不为空,那么左子树上的所有节点的值都小于等于根节点的值若它的右子树不为空,那么左子树上的所有节点的值…

免费像素画绘制软件 | Pixelorama v1.0.3

Pixelorama 是一款开源像素艺术多工具软件,旨在为用户提供一个强大且易于使用的平台来创作各种像素艺术作品,包括精灵、瓷砖和动画。这款软件以其丰富的工具箱、动画支持、像素完美模式、剪裁遮罩、预制及可导入的调色板等特色功能,满足了像素…

【JavaSE系列】注解

目录 前言 一、概述 二、Java预置注解 三、自定义注解 四、元注解 1. Retention 2. Target 3. Documented 4. Inherited 5. Repeatable 五、反射注解 总结 前言 随着Java语言的发展,注解(Annotations)逐渐成为了Java编程不可或…

Linux下进程间的通信--共享内存

共享内存概述: 共享内存是进程间通信的一种方式,它允许两个或多个进程共享一个给定的存储区。共享内存是最快的一种IPC形式,因为它允许进程直接对内存进行读写操作,而不需要数据在进程之间复制。 共享内存是进程间通信&#xff…

MySQL基础篇(黑马程序员2022-01-18)

1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: A. 使用表存储数据,格式统一,便于维护。…

【JavaScript】数据结构之树

什么是树形结构? 一种分层数据的抽象模型,用来分层级关系的。虚拟dom它所组织的那个数据原理就是树形结构 深度优先搜索(遍历)- 递归 从根出发,尽可能深的搜索树的节点技巧 访问根节点对根节点的children挨个进行深…

基于python+django+vue的社区爱心养老管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的社…

mysql的zip解压缩版安装

文章目录 一、MySQL下载二、mysql解压缩版安装1、解压缩2、设置环境变量3、mysql初始化4、安装mysql服务5、启动mysql服务6、连接mysql7、修改初始密码8、安装完成 一、MySQL下载 下载网址:MySQL下载 本文以mysql8.4.2版本为例下载解压缩版。 二、mysql解压缩版安…

ElementUI 快速入门:使用 Vue 脚手架搭建项目

文章目录 一 . ElementUI 的基本安装1.1 通过 Vue 脚手架创建项目1.2 在 vue 脚手架中安装 ElementUI1.3 编写页面 ElementUI 是 Vue.js 的强大 UI 框架,让前端界面开发变得简单高效。本教程将带你从安装到实战,快速掌握 ElementUI 的核心技巧。 核心内容…

MS SQL Server 实战 排查多列之间的值是否重复

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 SQL语句 小结 需求 在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据&…

【初阶数据结构】排序

目录 一、排序的概念及其运用 1.1排序的概念 1.2常见的排序算法 二、常见排序算法的实现 2 .1插入排序 2 .1.1基本思想: 2.1.2直接插入排序: 算法复杂度: 最坏情况: 最好的情况: 直接插入排序的特性总结&…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目,我已经上传了,资源链接. 起因, 目的: 每次都是新建一个 react 项目,有点繁琐。 刚刚学了路由,不如写一个 大一点的 app ,把前面写过的几个 app, 都包含进去。 这部分感觉就像是, …

BSV区块链上的覆盖网络服务现已开放公测

​​发表时间:2024年8月30日 BSV区块链的覆盖网络服务现已正式开放公测。对于BSV区块链生态系统内的特定交易类型和数据管理及访问,覆盖网络服务都可以为它们提供强大、可扩展、并且合规的解决方案。覆盖网络以及其它即将推出的BSV服务将赋予开发者、企业…

SQL Server开启网络访问

目前工作中很少用到SQL Server了,最近需要测试几个表,需要搭建一个SQL Server数据库服务,这里做个总结吧。 安装这里就不做详细介绍了,本文只介绍如何开启SQL Server网络访问。 1、云服务器安全组设置 如果是搭建在云服务器上&a…