• 【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 的设计让开发者能更好地应对复杂的需求。

  • 相关阅读:
    数据结构精讲(清华版)
    基于SSM的家庭理财系统的设计与实现
    [递归]有理数树
    基于复合粒子群优化的模糊神经预测控制的研究(Matlab代码实现)
    图像处理笔记3-Canny边缘检测算法与原理
    制作本地kubernetes镜像仓库(使用reposync、createrepo、httpd)
    latex中appendix附录怎么写
    DockerFile常用保留字指令及知识点合集
    小啊呜产品读书笔记001:《邱岳的产品手记-03》第04+05讲 如何当好AI时代的产品经理 & 06讲 产品案例分析·TheGuardian的文本之美
    【机器学习】集成学习:scikitLearn实现AdaBoost及梯度提升GradientBoosting,及XGBT库
  • 原文地址:https://blog.csdn.net/linjiuxiansheng/article/details/142153236