【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 分发到 get 、post 等方法 | 继承自 View ,同时增加了请求对象的初始化 |
请求处理 | 只负责 HTTP 方法的处理 | 增加了认证、权限、限流机制 |
适用场景 | 适用于通用的 Web 开发 | 适用于 API 开发,安全机制健全 |
使用场景分析
- CBV 适合传统的 Web 应用开发,尤其是以模板渲染为主的场景。
- APIView 则更适合 RESTful API 开发,它内置了很多用于处理 API 请求的功能,比如认证和限流,使得开发者能更专注于业务逻辑,而不必重复造轮子。
通过对 CBV 和 APIView 的对比分析,我们可以发现它们的核心逻辑相似,但在实际使用中,APIView
具有更多的扩展能力,尤其是对于 API 开发,DRF 的设计让开发者能更好地应对复杂的需求。