django基于restframework的CBV封装详解

yizhihongxing

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日

相关文章

  • 最新QQ6.8体验版下载发布 版本号13530

    最新QQ6.8体验版下载发布攻略 版本号:13530 欢迎使用最新发布的QQ6.8体验版!本攻略将为您提供详细的下载和安装步骤,以及两个示例说明。 下载步骤 首先,访问QQ官方网站(https://www.qq.com)。 在网站首页,找到并点击“下载”按钮。 在下载页面,您将看到最新版本的QQ体验版(版本号:13530)。点击下载按钮开始下载安装程序。 安…

    other 2023年8月3日
    00
  • 详解C++值多态中的传统多态与类型擦除

    详解C++值多态中的传统多态与类型擦除 本文主要讲解C++中的多态,其中包括传统多态和类型擦除两种方式。 传统多态 什么是传统多态 传统多态是指在C++中,基类类型的指针或引用可以指向其派生类的对象,从而实现多态的特性,可以通过虚函数表来实现运行时的动态绑定。 如何实现传统多态 我们通过一个简单的示例来说明传统多态的实现过程。如下所示,我们定义了一个动物类和…

    other 2023年6月26日
    00
  • Redis数组和链表深入详解

    Redis数组和链表深入详解 什么是Redis数组 Redis数组是Redis中的一种基本数据结构,也称为列表(List)。和普通数组相比,Redis数组在功能上更加强大和灵活。 Redis数组中,每个元素都有一个索引(index),可以根据索引来访问或者修改数组中的元素。同时,Redis数组还可以支持在头部或者尾部插入元素,或者在任意位置插入元素,甚至支持…

    other 2023年6月27日
    00
  • Spring Boot访问静态资源css/js,你真的懂了吗

    下面是完整攻略: Spring Boot访问静态资源 什么是静态资源 静态资源(Static Resources),通常指不需要动态生成的文件,比如HTML、CSS、JS、图片等。静态资源一般存放在Web应用的WebRoot目录下。 Spring Boot静态资源访问配置 Spring Boot使用默认的静态资源路径,如下: classpath:/META-…

    other 2023年6月27日
    00
  • wpf设置控件大小和位置

    以下是关于“WPF设置控件大小和位置”的完整攻略,包括如何设置控件的大小和位置,以及两个示例说明。 设置控件大小和位置 在WPF中,可以使用控件的Width、Height、Margin、HorizontalAlignment和VerticalAlignment属性来设置控件的大小和位置。 Width和Height属性 Width和Height属性用于设置控件…

    other 2023年5月7日
    00
  • Java源码解析之GenericDeclaration详解

    Java源码解析之GenericDeclaration详解攻略 什么是GenericDeclaration GenericDeclaration是Java泛型机制中的一个接口,表示定义泛型类型、方法或类型变量的通用声明。因此,GenericDeclaration可以是类、方法或类型变量。泛型机制需要这些通用声明来支持泛型类型或方法的调用。 GenericDe…

    other 2023年6月27日
    00
  • androidtextview添加下划线

    在Android中,可以使用TextView来显示文本。如果需要在TextView中添加下划线,可以使用以下两种方法: 使用HTML标记 可以使用HTML标记来添加下划线。以下是示例代码: “`xml <TextView android:id=”@+id/textView” android:layout_width=”wrap_content” an…

    other 2023年5月7日
    00
  • Python使用configparser库读取配置文件

    当我们需要在Python应用程序中读取配置时,可以使用configparser库来管理配置文件。下面是基于configparser库的完整攻略: 1. 安装configparser库 configparser库是Python的内置库,所以不需要额外的安装。 2. 创建配置文件 我们可以使用一个文本文件来存储配置数据,通常将它命名为config.ini(也可以…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部