【Django DRF】views知识总结----相对于原生django,APIView,ViewSet的使用

Django DRF (Django Rest Framework) 的 Views 知识总结

1. 概述

Django Rest Framework (DRF) 的视图主要用于构建 API。它们扩展了 Django 的视图概念,支持序列化数据和处理各种 HTTP 请求。

DRF 提供两种视图:

  1. 基于函数的视图(Function-Based Views, FBV)
  2. 基于类的视图(Class-Based Views, CBV),包括:
    • 通用视图(Generic Views)。
    • 自定义视图。

2. 基于函数的视图(FBV)

(1)定义
  • 使用 @api_view 装饰器定义 API 视图。
(2)示例代码
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['GET', 'POST'])
def api_function_view(request):
    if request.method == 'GET':
        data = {"message": "This is a GET request"}
        return Response(data)
    elif request.method == 'POST':
        data = {"message": "This is a POST request"}
        return Response(data)
(3)特点
  • 简单明了,适合快速构建小型 API。
  • 手动处理请求方法逻辑,适合简单逻辑。

3. 基于类的视图(CBV)

(1)定义
  • 继承 DRF 的 APIView 类,分离不同 HTTP 方法的逻辑(getpost 等)。
(2)示例代码
from rest_framework.views import APIView
from rest_framework.response import Response

class APIClassView(APIView):
    def get(self, request):
        data = {"message": "This is a GET request"}
        return Response(data)

    def post(self, request):
        data = {"message": "This is a POST request"}
        return Response(data)
(3)特点
  • 支持面向对象的逻辑封装。
  • 更适合复杂场景和扩展。

4. 通用视图(Generic Views)

(1)定义
  • DRF 提供的内置通用视图,简化了常见的 CRUD 操作。
(2)常见视图
  1. ListAPIView:返回对象列表。

    from rest_framework.generics import ListAPIView
    from myapp.models import MyModel
    from myapp.serializers import MyModelSerializer
    
    class MyModelListView(ListAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
  2. RetrieveAPIView:返回单个对象详情。

    from rest_framework.generics import RetrieveAPIView
    
    class MyModelDetailView(RetrieveAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
  3. CreateAPIView:创建新对象。

    from rest_framework.generics import CreateAPIView
    
    class MyModelCreateView(CreateAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
  4. UpdateAPIView:更新对象。

  5. DestroyAPIView:删除对象。

  6. ListCreateAPIViewRetrieveUpdateDestroyAPIView:组合操作。

(3)特点
  • 简化 CRUD 操作。
  • querysetserializer_class 配合使用,极大提高开发效率。

5. ViewSet

(1)定义
  • ViewSet 是 DRF 中的高级类视图,进一步封装了 Generic Views,适合更复杂的 API。
(2)常见类型
  1. ViewSet:完全自定义。

    from rest_framework.viewsets import ViewSet
    from rest_framework.response import Response
    
    class MyViewSet(ViewSet):
        def list(self, request):
            return Response({"message": "List of objects"})
    
        def retrieve(self, request, pk=None):
            return Response({"message": f"Retrieve object {pk}"})
    
  2. GenericViewSet:结合通用视图。

    from rest_framework.viewsets import GenericViewSet
    from rest_framework.mixins import ListModelMixin, RetrieveModelMixin
    
    class MyGenericViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
  3. ModelViewSet:完整的 CRUD 功能。

    from rest_framework.viewsets import ModelViewSet
    
    class MyModelViewSet(ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
(3)特点
  • 将所有逻辑封装到单个类中。
  • 结合路由系统可以快速生成标准 RESTful API。

6. 路由配置

(1)普通视图的路由
from django.urls import path
from .views import api_function_view, APIClassView

urlpatterns = [
    path('function-view/', api_function_view),
    path('class-view/', APIClassView.as_view()),
]
(2)ViewSet 的路由
  • 使用 DefaultRouter 自动生成路由。
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet

router = DefaultRouter()
router.register(r'mymodel', MyModelViewSet)

urlpatterns = router.urls

7. 请求与响应

(1)接收请求
  • request 对象:
    • request.data:解析请求体中的 JSON 数据。
    • request.query_params:查询参数。
(2)返回响应
  • Response 对象:
    • 返回 JSON 格式数据。
    • 支持自定义状态码和 headers。
示例:
from rest_framework.response import Response
from rest_framework.views import APIView

class MyAPIView(APIView):
    def post(self, request):
        data = request.data
        return Response({"received_data": data}, status=201)

8. 权限、认证与节流

(1)权限(Permissions)
  • 控制谁能访问视图。
  • 示例:
    from rest_framework.permissions import IsAuthenticated
    
    class SecureView(APIView):
        permission_classes = [IsAuthenticated]
    
(2)认证(Authentication)
  • 支持多种认证方式(如 Token、JWT)。
  • 示例:
    from rest_framework.authentication import TokenAuthentication
    
    class SecureView(APIView):
        authentication_classes = [TokenAuthentication]
    
(3)节流(Throttling)
  • 控制请求速率,防止滥用。

9. 小结

  • DRF 的 Views 提供了从简单到复杂的多种选择:
    • FBV:简单 API。
    • CBV:结构化和扩展性好。
    • 通用视图和 ViewSet:快速构建 RESTful API。
  • 配合序列化器、路由系统、权限等模块,可以高效构建强大的 API 系统。

你可能感兴趣的:(Django,DRF,django,sqlite,python,DRF,APIView,ViewSet)