介绍
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
微信扫一扫
支付宝扫一扫