类视图 (CBV) 与 Django REST Framework (DRF) 视图的区别

在 Django 中,除了最基础的函数视图 (FBV),我们还会经常使用 类视图 (Class-based View, CBV)

而在开发 API 时,又会用到 Django REST Framework (DRF) 提供的视图体系。

那么,CBV 与 DRF 的视图有什么区别?

本文将从执行流程、请求处理方式、返回对象、额外功能等多个方面进行对比。


1. CBV 的处理流程

Django 的类视图继承自 View,内部会根据请求方法 (GETPOST 等) 分发到对应的方法。

流程图如下:

python 复制代码
浏览器 / 客户端请求
    │
    ▼
WSGI/ASGI Handler
    │
    ▼
URLResolver / URLPattern
    │
    ▼
Class-based View (View / TemplateView)
    │
    ├─ 调用对应方法 get()/post()/...
    │
    ▼
HttpResponse (HTML / 字符串)

示例:

python 复制代码
from django.views import View
from django.http import HttpResponse

class HelloView(View):
    def get(self, request):
        return HttpResponse("Hello Django CBV!")

注册路由:

python 复制代码
urlpatterns = [
    path("hello/", HelloView.as_view()),
]

请求 /hello/ 时,Django 调用 HelloView.get() 并返回 HttpResponse


2. DRF 的处理流程

DRF 在 CBV 的基础上进行了扩展,核心基类是 APIView

相比 CBV,DRF 的视图多了请求解析、序列化、权限校验等功能。

流程图如下:

python 复制代码
浏览器 / 客户端请求
    │
    ▼
WSGI/ASGI Handler
    │
    ▼
URLResolver / URLPattern / Router
    │
    ▼
DRF View (APIView / GenericAPIView / ViewSet)
    │
    ├─ 解析 request.data / query_params
    ├─ 调用 get()/post()/... 方法
    ├─ 使用 Serializer 序列化/反序列化数据
    ├─ 权限认证、限流、分页等处理
    ▼
Response 对象 (JSON)

示例:

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response

class HelloAPIView(APIView):
    def get(self, request):
        return Response({"message": "Hello DRF!"})

注册路由:

python 复制代码
urlpatterns = [
    path("hello/", HelloAPIView.as_view()),
]

请求 /hello/ 时,DRF 自动将返回对象封装为 JSON 响应。


3. 核心区别对比

对比维度 CBV (Django) DRF (APIView / ViewSet)
返回对象 HttpResponse (HTML/字符串) Response (JSON)
请求数据 request.GET, request.POST request.data 自动解析 JSON/Form/Multipart
功能扩展 模板渲染、Form 处理 序列化器、认证、权限、分页、过滤、限流
适用场景 传统 Web 页面渲染 构建 RESTful API

4. 举例对比

  • CBV 示例:
python 复制代码
class HelloView(View):
    def post(self, request):
        name = request.POST.get("name")
        return HttpResponse(f"Hello {name}")
  • DRF 示例:
python 复制代码
class HelloAPIView(APIView):
    def post(self, request):
        name = request.data.get("name")
        return Response({"message": f"Hello {name}"})

从代码可以看到:

  • CBV 依赖 request.POST

  • DRF 自动解析 JSON / Form,直接用 request.data


5. 总结

  1. 返回对象不同

    • CBV → HttpResponse

    • DRF → Response

  2. 请求数据处理不同

    • CBV → request.GET, request.POST

    • DRF → request.data,支持 JSON 等多种格式

  3. 功能扩展

    • CBV 更适合传统网页

    • DRF 专为 API 设计,支持序列化器、认证、权限、分页等

如果你的项目是 Web 页面 ,选择 CBV;

如果你在开发 RESTful API,那么 DRF 是更好的选择。

相关推荐
龙腾AI白云11 小时前
多模大模型应用实战:智能问答系统开发
python·机器学习·数据分析·django·tornado
程序媛徐师姐13 小时前
Python基于OpenCV的马赛克画的设计与实现【附源码、文档说明】
python·opencv·django·马赛克绘画·python马赛克绘画系统·马赛克画·python马赛克画
斯班奇的好朋友阿法法15 小时前
Django 项目打包部署完整指南(适配你的项目,零报错)
python·django·sqlite
斯班奇的好朋友阿法法15 小时前
Django 3.2 项目:从 Hello World 开始(完整功能版)
python·django
源码之屋2 天前
计算机毕业设计:Python天气数据采集与可视化分析平台 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅
人工智能·python·深度学习·算法·django·线性回归·课程设计
架构师老Y2 天前
003、Python Web框架深度对比:Django vs Flask vs FastAPI
前端·python·django
暴力袋鼠哥2 天前
基于 Django 与 Vue 的汽车数据分析系统设计与实现
vue.js·django·汽车
360智汇云2 天前
PostgreSQL 全文检索深度指南:内置 FTS、zhparser 与 pg_search 全解
postgresql·django·全文检索
leo_messi943 天前
2026版商城项目(三)-- ES+认证服务
后端·python·django
毕胜客源码4 天前
改进yolov8的香蕉成熟度检测系统,改进前后的模型指标对比,有技术文档,支持图像、视频和摄像实时检测
人工智能·python·深度学习·yolo·django