django基于restframework的CBV封装详解

Django基于Rest Framework的CBV封装详解

什么是CBV?

CBV全称为Class-Based Views,中文名为基于类的视图,是Django框架中的一种视图函数封装方式。与FBV不同,CBV重点是通过类的继承和重载的方式,对通用的视图功能进行封装,提高代码的重用性。

在实际开发中,CBV通常比FBV更加优雅、简洁、易于维护和扩展,因此,深入了解和掌握CBV的使用,对于Django开发者来说是非常重要的。

Rest Framework与CBV的结合

Django Rest Framework(以下简称DRF)提供了一系列和RESTful API开发相关的扩展,可以大大简化API的开发流程和代码量。

在DRF中,CBV得到了充分的支持和推广,特别是基于genericsmixins的CBV,致力于提供更加灵活、强大的API视图函数封装方式。

下面我们将一步步的讲解DRF如何使用CBV来封装API视图。

生成项目

首先,我们需要生成一个Django项目和应用,通过命令行输入以下指令:

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

其中,myproject和myapp分别为项目和应用的名称,读者可以根据实际需求进行修改。

安装依赖

在使用DRF之前,我们需要安装对应的依赖库,输入以下指令:

pip install djangorestframework==3.12.4
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support

安装完成后,在myproject目录下的settings.py文件中加入DRF,并设置REST_FRAMEWORK参数,示例如下:

INSTALLED_APPS = [
    # ...
    'rest_framework',
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAdminUser',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
}

引入基础视图类

在Django Rest Framework中,通常会使用到如下这些基础视图类,需要在我们的视图中进行引用:

from rest_framework import generics
from rest_framework import mixins
from rest_framework import viewsets
from rest_framework.response import Response
  • generics.GenericAPIView:通用视图类,主要提供一些常用的方法,如get()post()等。但是该类并没有提供具体实现,需要和mixins配合使用。
  • mixins.CreateModelMixin:提供了create()方法,用于新建数据。
  • mixins.RetrieveModelMixin:提供了retrieve()方法,用于查询单条数据。
  • mixins.UpdateModelMixin:提供了update()方法,用于修改数据。
  • mixins.DestroyModelMixin:提供了destroy()方法,用于删除数据。
  • mixins.ListModelMixin:提供了list()方法,用于查询数据列表。

常用的API视图

基于GenericAPIView的视图

GenericAPIView提供了get、post、put、delete等方法,但是不提供具体实现。需要配合mixins使用。这种视图适用于比较基础的增删改查操作。示例如下:

class UserListAPIView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):
    queryset = User.objects.all()
    serializer_class = UserSerializer  # 序列化器类

    def get(self, request, *args, **kwargs):
        # 在此进行get请求的一些相关业务操作
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        # 在此进行post请求的一些相关业务操作
        return self.create(request, *args, **kwargs)

基于ViewSet的视图

ViewSet是另一种比较常用的视图API,它可以针对传入请求的类型自动分配处理方法。对于较为复杂的业务场景,我们可以通过继承ViewSet并重载对应的方法来处理请求。示例如下:

class UserViewSet(viewsets.ViewSet):

    def list(self, request):
        # 在此进行list请求的一些相关业务操作
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

    def create(self, request):
        # 在此进行create请求的一些相关业务操作
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

使用路由

在过程中你需要将视图函数绑定至URL地址。我们需要配置一下路由,为API视图提供URL路由。示例如下:

from django.urls import path, include
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),

    # 定义API视图路由
    path('users/', views.UserListAPIView.as_view()),
    path('users/<int:pk>/', views.UserDetailAPIView.as_view()),
]

示例1:基于GenericAPIView的视图实现用户的增删改查操作

class UserListAPIView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):
    queryset = User.objects.all()
    serializer_class = UserSerializer   # 需要定义UserSerializer

    def get(self, request, *args, **kwargs):
        # 在此进行get请求的一些相关业务操作
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        # 在此进行post请求的一些相关业务操作
        return self.create(request, *args, **kwargs)


class UserDetailAPIView(generics.GenericAPIView, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get(self, request, *args, **kwargs):
        # 在此进行get请求的一些相关业务操作
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        # 在此进行put请求的一些相关业务操作
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        # 在此进行delete请求的一些相关业务操作
        return self.destroy(request, *args, **kwargs)

示例2:基于ViewSet的视图实现用户的列表和详情查询操作

class UserViewSet(viewsets.ViewSet):

    def list(self, request):
        # 在此进行list请求的一些相关业务操作
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk):
        # 在此进行retrieve请求的一些相关业务操作
        user = get_object_or_404(User, pk=pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

以上就是Django基于Rest Framework的CBV封装的详细攻略,希望能对读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django基于restframework的CBV封装详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 请问如何查询一个app的android和ios下载量?

    要查询一个App的Android和iOS下载量,需要分别通过Google Play和App Store进行查询。具体步骤如下: 在Google Play查询Android下载量 打开Google Play网站或应用,搜索要查询的App,进入App页面。 在App页面向下滑动,查看页面底部的下载量信息。如果没有直接显示下载量信息,可以点击“Install”按钮…

    其他 2023年4月16日
    00
  • oracle函数分组求和

    Oracle函数分组求和 在Oracle数据库中,使用聚合函数可以对一组数据进行汇总计算。聚合函数主要包括SUM、AVG、MAX、MIN、COUNT等,这些函数一般用于分组计算,以得到更细致、更直观的数据分析结果。在某些场景下,我们需要使用聚合函数进行分组求和,以实现数据统计和分析的需求。本文将详细介绍Oracle函数分组求和的用法和实现方法,帮助大家更好地…

    其他 2023年3月28日
    00
  • MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)

    MyEclipse代码编辑器中汉字太小的解决办法(中文看不清) 如果您在使用MyEclipse代码编辑器过程中发现汉字显示太小,影响阅读和操作,不要着急,本文将向您介绍如何解决这个问题。 解决办法 在MyEclipse中,可以通过以下步骤进行设置: 打开MyEclipse,进入菜单栏“Window”,选择“Preferences”。 在弹出的窗口中,展开“G…

    其他 2023年3月28日
    00
  • pycharm专业版免费激活的三种方法

    以下是“PyCharm专业版免费激活的三种方法”的完整攻略: PyCharm专业版免费激活的三种方法 PyCharm是一款强大的Python集成开发环境,提供了丰富的功能和工具。PyCharm专业版是其高级版本,提供了更多的功能和扩展性。本攻略将详细讲解PyCharm专业版免费激活的三种方法,包括使用激活码、使用破解补丁和使用Docker容器等。 使用激活码…

    other 2023年5月8日
    00
  • Java优化for循环嵌套的高效率方法

    Java优化for循环嵌套的高效率方法攻略 在Java中,for循环嵌套是一种常见的编程结构,但是当嵌套层数增加时,性能可能会受到影响。为了提高代码的执行效率,我们可以采取一些优化方法。下面是一些优化for循环嵌套的高效率方法的攻略。 1. 减少循环次数 在嵌套的for循环中,减少循环次数是提高效率的关键。可以通过以下方法来实现: for (int i = …

    other 2023年7月27日
    00
  • 前端存储

    前端存储 前端存储是指在浏览器端存储数据的技术,它可以使网页在不同的浏览器和设备之间共享数据,提高用户体验。本文将详细介绍前端存储的几种方式,包括Cookie、localStorage、sessionStorage和IndexedDB,并提供示例说明。 Cookie Cookie是一种在浏览器存储数据的技术,它可以存储少量的数据,并在浏览器和服务器之间传递数…

    other 2023年5月9日
    00
  • html代码中的空格和空行

    HTML代码中的空格和空行 在编写HTML代码时,不仅要注意标签的正确使用,还需要注意空格和空行的合理使用,这有助于提高代码的可读性、易维护性和网页的访问速度。 空格的使用 在HTML代码中,需要使用空格来区分标签、属性、属性值等。 标签和属性之间的空格 HTML标签和属性之间需要一个空格来分隔,例如: <a href="https://ww…

    其他 2023年3月28日
    00
  • modelandview重定向

    ModelAndView重定向 在Spring MVC中,我们经常需要进行重定向,这时就需要用到ModelAndView重定向。 ModelAndView简介 先来了解一下什么是ModelAndView。在Spring MVC中,Controller的处理结果需要在View中进行展示,而ModelAndView就是一个封装了Model和View的类。其中,M…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部