文具网站建设,全网营销网站建设特点,wordpress APP canwp,金融类网站设计Django Class-Based Views (CBV) 与 DRF APIView 的区别解析
在 Django 开发中#xff0c;基于类的视图#xff08;Class-Based Views, CBV#xff09;是实现可重用性和代码结构化的利器。而 Django REST Framework (DRF) 提供的 APIView 是针对 API 开发的扩展。 一、CBV …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 viewas_view 方法返回一个闭包函数 view当有请求进来时view 函数会被调用。view 内部实例化视图类 BookView()然后调用 dispatch 方法进行请求处理。
2. dispatch 方法
def dispatch(self, request, *args, **kwargs):handler getattr(self, request.method.lower()) # 获取对应的处理方法如 get/postreturn 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 APIViewclass 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 viewAPIView 重写了 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 的设计让开发者能更好地应对复杂的需求。