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封装的详细攻略,希望能对读者有所帮助。

阅读剩余 75%

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

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

相关文章

  • c语言undefined哪些

    c语言中定义未定义行为undefined哪些? 在C语言中,定义未定义行为(undefined behavior)是一个容易被误解和忽略的概念。在编写C语言程序时,忽略这些并不明确定义的行为可能会导致代码的不可预测和异常行为。 以下是一些C语言中定义为未定义行为的例子: 1. 访问未初始化的变量 在C语言中如果将未初始化的变量用作值,那么程序的行为是未定义的…

    其他 2023年3月28日
    00
  • 深入解析JVM之内存结构及字符串常量池(推荐)

    深入解析JVM之内存结构及字符串常量池(推荐) 介绍 在Java开发中,了解JVM(Java虚拟机)的内存结构及字符串常量池是非常重要的。本攻略将详细讲解JVM的内存结构以及字符串常量池,并提供示例说明。 JVM内存结构 JVM的内存结构主要包括以下几个部分: 方法区(Method Area):用于存储类的结构信息,如类的字段、方法、常量池等。方法区是所有线…

    other 2023年8月2日
    00
  • C++11新特性std::tuple的使用方法

    当我们需要返回多个值的时候,一般会选择使用结构体或者数组来实现。但使用结构体时,需要事先定义一个结构体,并在调用函数时传入已经定义好的结构体类型;使用数组时,就需要定义数组的长度,也不方便返回不同类型的数据。针对这些问题,C++11引入了std::tuple,可以便捷地封装多组不同类型的数据。 下面先给出std::tuple的定义和一些基本用法。头文件为 s…

    other 2023年6月26日
    00
  • css-css选择器:id或类中的第一个div

    CSS选择器:id或类中的第一个div 在CSS中,我们可以使用选择器来选择HTML元素,并对其应用样式。有时候,我们需要选择id或中的第一个div元素,以对其应用特定的样式。本文将详细讲解如何CSS选择器选择id或类中的第一个div元素。 实步骤 以下是使用CSS选择器选择id或类中的第一个div元素的步骤: 使用:first-child伪类选择第一个di…

    other 2023年5月9日
    00
  • centos7部署ssserver

    CentOS 7 部署 ssserver 完整攻略 ssserver 是一个基于 Python 的 Shadowsocks 服务器,用于加密和代理网络流量。在本攻略,我们将详细介绍如何在 CentOS 7 上部署 ssserver。 步骤1:安装 Python 和 pip 在部署 server 之前,需要先安装 Python 和 pip。以下是一个示例命令:…

    other 2023年5月6日
    00
  • 浅析iOS给图片加水印的方法

    以下是“浅析iOS给图片加水印的方法”的详细攻略: 目录 前言 使用Core Graphics给图片加水印 示例代码 使用第三方库给图片加水印 示例代码 总结 前言 在iOS开发中,经常需要对图片进行加水印的操作。加水印可以有效地保护图片的版权,也可以用来标记图片的来源或者内容。本文将探讨两种常见的图片加水印方法:使用Core Graphics和使用第三方库…

    other 2023年6月26日
    00
  • 通过a标签(不丢失referrer)打开另一个窗口

    通过a标签(不丢失referrer)打开另一个窗口 在网站开发中,我们常常需要在页面中设置外链,让用户可以访问相关网站。但有时候我们又希望用户可以在不离开当前页面的情况下访问其他网站。这时候就需要使用a标签的目标属性(target)来控制链接的打开方式。 在a标签中可以设置target属性,该属性可以有以下几种不同的值: _blank:在新窗口中打开链接 _…

    其他 2023年3月28日
    00
  • 教你如何使用MySQL8递归的方法

    教你如何使用MySQL8递归的方法 当我们需要在MySQL中进行分层查询时,递归查询是非常有用的技巧。MySQL8中提供了WITH RECURSIVE语句来实现递归查询。本文将详细讲解如何使用MySQL8递归的方法,帮助您更好的理解递归查询。 WITH RECURSIVE语句基本语法 WITH RECURSIVE语句的基本语法如下: WITH RECURSI…

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