在 Django 中,除了最基础的函数视图 (FBV),我们还会经常使用 类视图 (Class-based View, CBV) 。
而在开发 API 时,又会用到 Django REST Framework (DRF) 提供的视图体系。
那么,CBV 与 DRF 的视图有什么区别?
本文将从执行流程、请求处理方式、返回对象、额外功能等多个方面进行对比。
1. CBV 的处理流程
Django 的类视图继承自 View
,内部会根据请求方法 (GET
、POST
等) 分发到对应的方法。
流程图如下:
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. 总结
-
返回对象不同
-
CBV →
HttpResponse
-
DRF →
Response
-
-
请求数据处理不同
-
CBV →
request.GET
,request.POST
-
DRF →
request.data
,支持 JSON 等多种格式
-
-
功能扩展
-
CBV 更适合传统网页
-
DRF 专为 API 设计,支持序列化器、认证、权限、分页等
-
如果你的项目是 Web 页面 ,选择 CBV;
如果你在开发 RESTful API,那么 DRF 是更好的选择。