深入了解Django REST framework中的APIView

介绍

Django是最流行的Python Web框架之一,它提供了方便的开发开发Web应用程序的工具和框架。Django REST framework(简称DRF)是用于构建API的强大框架,它提供了各种视图类(View),其中最常用的是APIView。APIView是一个基于类的视图,允许我们使用Python面向对象编程来快速而灵活地构建API视图。

一、APIView的基础认识

APIView是DRF API视图的基础类。一个APIView和Django中的View非常相似。可以理解为是从视图函数TableView类中派生出来的一个新类。
APIView类使用的设计模式是模板方法模式。因此,APIView类定义了模板方法(如get()、post()等),以及其他辅助方法来显示DRF API视图的相关功能。

from rest_framework.views import APIView
from rest_framework.response import Response

class HelloApiView(APIView):
    """Test API View."""

    def get(self, request, format=None):
        """Return a list of APIView features."""

        an_apiview = [
            'Uses HTTP methods as function (get, post, put, patch, delete)',
            'Is similar to a traditional Django view',
            'Gives you the most control over your logic',
            'Is mapped manually to URLs'
        ]

        return Response({'message': 'Hello!', 'an_apiview': an_apiview})

二、APIView的RESTful API特性

像Django和其他RESTful框架,DRF APIView支持RESTful API。 RESTful API的概念来源于REST风格的网络服务。

利用APIView,我们可以将DRF视图细化到资源API中的单个方法或操作。这意味着在APIView中可以使用五个常用的HTTP方法:GET,POST,PUT,PATCH和DELETE。每个方法自己对资源列表(集合)或单个资源进行操作,包括:获取、创建、更新和删除。

当然,确保使用DRF需要导入DRF模块,并从APIView扩展。

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class HelloApiView(APIView):
    """Test API View."""

    def get(self, request, format=None):
        """Return a list of APIView features."""

        an_apiview = [
            'Uses HTTP methods as function (get, post, put, patch, delete)',
            'Is similar to a traditional Django view',
            'Gives you the most control over your logic',
            'Is mapped manually to URLs'
        ]

        return Response({'message': 'Hello!', 'an_apiview': an_apiview})

    def post(self, request):
        """Create a hello message with our name."""

        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            name = serializer.validated_data.get('name')
            message = f'Hello {name}!'
            return Response({'message': message})
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

三、APIView的验证方式

作为一个开发者,我们需要保证安全性并且禁止可能的恶意行为。在DRF框架中,这是通过设置不同的许可证类来实现的:
allowany,apiviewer,apiview allowany, apiview AllowAny等。这些许可证类确定API的访问权限,防止未经授权的访问。

allowany

Any用户是最基本的许可类。只要请求有效,API的任何部分都可以通过这个许可类得到访问权限。

from rest_framework.permissions import AllowAny
from rest_framework.views import APIView
from rest_framework.response import Response

class HelloView(APIView):

    permission_classes = (AllowAny,)

    def get(self, request, format=None):
        return Response({'Hello, World!'})

apiviewer

通过这个许可证类,我们需要一个具有基本身份验证的用户才能访问API的特定部分。

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response

class HelloView(APIView):

    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        return Response({'Hello, World!'})

apiview AllowAny

这种许可证防止HTTP BASIC验证错误锁定APIs。

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import AllowAny

class AuthenticatedView(APIView):

    authentication_classes = [BasicAuthentication]
    permission_classes = [AllowAny]

    def get(self, request, format=None):
        return Response({'message': 'Success!'})

四、APIView和View的区别

除了APIView之外,Django【rest-framework】还提供了其他几种视图类(View Class),其中之一就是View类。ViewSet是一个在APIView和View之间的类。

尽管APIView类和View类(通常称为function-based views)提供了相同的功能,但使用APIView类会更容易。这是因为仅使用APIView类,我们可以使所有方法的逻辑分布在一个小的代码单元中。同时,APIView也让我们更清晰地组织代码、减少Bug、保护我们的代码并改进重用性。总之,APIView类是View的升级版。

五、APIView和ViewSet区别

APIView和ViewSet经常被同时使用。但是,ViewSet在APIView之上具有两个主要优点:

  • ViewSet提供了更好的代码重用性
  • ViewSet可以将模型与视图类结合在一起,而APIView不行

使用视图集ViewSet,我们可以在一个视图类中使用多种请求方法,并将它们关联到一个具体的模型。例如,我们可以像这样创建一个视图集:

from rest_framework import viewsets

class ArticleViewSet(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()

从代码片段中,可以看出ViewSet比APIView更灵活、更易于编写和快速调整代码。另外,ViewSet强制使用诸如get、post、put、patch和delete等HTTP方法的设计模式。视图可轻松地解决不同的请求类型和代码操作,并通过DRF进行错误处理。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/257092.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-15 12:43
下一篇 2024-12-15 12:43

相关推荐

  • Django ORM如何实现或的条件查询

    在我们使用Django进行数据库操作的时候,查询条件往往不止一个,一个好的查询语句需要考虑我们的查询要求以及业务场景。在实际工作中,我们经常需要使用或的条件进行查询,本文将详细介绍…

    编程 2025-04-29
  • Django项目中执行Python脚本

    本文将阐述在Django项目中如何执行Python脚本以及执行脚本的几种方式。 一、subprocess模块执行Python脚本 subprocess模块提供了一个简单的接口用于创…

    编程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • Python Django Channels用法介绍

    本文将从多个方面对Python Django Channels进行详细的讲解,包括介绍、使用、优缺点以及实际应用等,帮助大家更好地理解和应用Python Django Channe…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25

发表回复

登录后才能评论